问题
I was wondering whether it's possible to upload a file from Mathematica to ifile.it. I have seen the API of ifile.it, however, I still don't know how it works. Furthermore, the closest example I've seen in Mathematica is 'Twittering with Mathematica', but it's not clear to me, how can I use a GET request from that example.
Thanks in advance
回答1:
Setup the Java HttpClient library.
<< JLink`
client = JavaNew["org.apache.commons.httpclient.HttpClient"]
(*
Out[3]= JLink`Objects`vm1`JavaObject17955866594508801
*)
Determine which server to use.
method = JavaNew["org.apache.commons.httpclient.methods.GetMethod",
"http://ifile.it/upload:api_fetch_upload_server"]
(*
Out[4]= JLink`Objects`vm1`JavaObject3301364646019073
*)
client@executeMethod[method]
(*
Out[5]= 200
*)
id = "server_id" /. ImportString[method@getResponseBodyAsString[], "JSON"]
(*
Out[6]= "55"
*)
Upload the file to the server with a POST request using a MultipartRequestEntity with a FilePart.
method = JavaNew["org.apache.commons.httpclient.methods.PostMethod",
"http://s" <> ToString[id] <> ".ifile.it/upload?apikey=" <> apikey]
(*
Out[7]= JLink`Objects`vm1`JavaObject25911718337052673
*)
filename = NotebookFileName[];
file = JavaNew["java.io.File", filename]
(*
Out[9]= JLink`Objects`vm1`JavaObject27844190972936193
*)
part = JavaNew["org.apache.commons.httpclient.methods.multipart.FilePart",
file@getName[], file]
(*
Out[10]= JLink`Objects`vm1`JavaObject17546309972000769
*)
part@setContentType["application/vnd.wolfram.mathematica"]
part@setName["Filedata"]
entity = JavaNew[
"org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity",
{part}, method@getParams[]]
(*
Out[13]= JLink`Objects`vm1`JavaObject22100383232950273
*)
method@setRequestEntity[entity]
client@executeMethod[method]
(*
Out[15]= 200
*)
ImportString[method@getResponseBodyAsString[], "JSON"]
(*
Out[16]= {"file_key" -> "b8em0dc",
"file_md5" -> "acc9b7b3910b1e40188cf26ae3f20b80",
"file_mime" -> "text/plain", "file_name" -> "ifile.it.nb",
"file_size" -> "10473", "hash" -> "ca3d886713f64af6e9ffe6c3843d2eec",
"status" -> "ok", "url" -> "http://ifile.it/b8em0dc/ifile.it.nb"}
*)
回答2:
ragfield's answer gets points for not being a hack, but you can also do this without JLink:
UploadFile[url_, filePath_, urlParams___] := With[
{
bytes = Import[filePath, "Byte"],
filename = StringJoin[FileBaseName[filePath], ".", FileExtension[filePath]]
},
URLExecute[
url,
urlParams,
"Method" -> "POST",
"MultipartElements" -> {
{"file\"; filename=\"" <> filename, "application/octet-stream", bytes}
},
"Headers" -> {
"Accept" -> "application/json; charset=UTF-8",
"Content-Type" -> "multipart/form-data"
}
]
]
(Cross-answered from https://mathematica.stackexchange.com/questions/52338/more-complete-mutipartdata-posts-using-urlfetch/97658#97658)
来源:https://stackoverflow.com/questions/5853134/upload-to-ifile-it-through-mathematica