Wolfram mathematica 通过Mathematica上传到ifile.it
我想知道是否有可能从Mathematica上传一个文件到ifile.it。我看过ifile的版本。但是,我仍然不知道它是如何工作的。此外,我在Mathematica中看到的最接近的示例是“”,但我不清楚如何使用该示例中的GET请求Wolfram mathematica 通过Mathematica上传到ifile.it,wolfram-mathematica,Wolfram Mathematica,我想知道是否有可能从Mathematica上传一个文件到ifile.it。我看过ifile的版本。但是,我仍然不知道它是如何工作的。此外,我在Mathematica中看到的最接近的示例是“”,但我不清楚如何使用该示例中的GET请求 提前感谢设置Java HttpClient库 << JLink` client = JavaNew["org.apache.commons.httpclient.HttpClient"] (* Out[3]= JLink`Objects`vm1`Java
提前感谢设置Java HttpClient库
<< JLink`
client = JavaNew["org.apache.commons.httpclient.HttpClient"]
(*
Out[3]= JLink`Objects`vm1`JavaObject17955866594508801
*)
使用带有FilePart的MultipartRequestEntity,通过POST请求将文件上载到服务器
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"}
*)
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”,文件名]
(*
Out[9]=JLink`Objects`vm1`JavaObject27844190972936193
*)
part=JavaNew[“org.apache.commons.httpclient.methods.multipart.FilePart”,
file@getName[],文件]
(*
Out[10]=JLink`Objects`vm1`JavaObject17546309972000769
*)
part@setContentType[“application/vnd.wolfram.mathematica”]
part@setName[“文件数据”]
entity=JavaNew[
“org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity”,
{部分},method@getParams[]]
(*
Out[13]=JLink`Objects`vm1`JavaObject22100383232950273
*)
method@setRequestEntity[实体]
client@executeMethod[方法]
(*
Out[15]=200
*)
进口管柱[method@getResponseBodyAsString[],“JSON”]
(*
Out[16]={“文件密钥”->“b8em0dc”,
“文件”——>“acc9b7b3910b1e40188cf26ae3f20b80”,
“file\u mime”->“text/plain”,“file\u name”->“ifile.it.nb”,
“文件大小”->“10473”,“哈希”->“ca3d886713f64af6e9ffe6c3843d2eec”,
“状态”->“确定”,“url”->”http://ifile.it/b8em0dc/ifile.it.nb"}
*)
ragfield的答案因不是黑客而获得分数,但您也可以在没有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"
}
]
]
UploadFile[url,filePath,urlParams]:=带[
{
字节=导入[文件路径,“字节”],
filename=StringJoin[FileBaseName[filePath],“”,FileExtension[filePath]]
},
URL执行[
网址,
urlParams,
“方法”->“发布”,
“多要素”->{
{“文件\”文件名=\“文件名”,应用程序/八位字节流,字节数}
},
“标题”->{
“接受”->“应用程序/json;字符集=UTF-8”,
“内容类型”->“多部分/表单数据”
}
]
]
(交叉回答)如果我很好地理解API描述,您也需要HTTP POST。在Ragfield的Twitter博客中,你会发现一个指向Twitter.m的链接,其中包含一个HTTPPost函数。也许你可以用那个?我会给拉格菲尔德发电子邮件,让他注意你的问题。@Sjoerd:非常感谢。我期待着知道他的答案。至于使用Http Post请求,我将尝试一下。效果很好!非常感谢你。现在,我将不得不分析你的代码,以了解它是如何工作的!太快了!几个问题:传输二进制文件而不是普通ASCII格式的Mathematica笔记本需要做哪些修改?是否仅更改内容类型字段,或者是否需要使用InputString或其他方式将编码更改为base64?@sjoerd-c-de-vries这也适用于二进制文件,无需进一步编码。只需确保使用正确的MIME类型(例如图像/jpeg)。编辑代码,以便将其复制到Mma中。希望你不介意
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"
}
]
]