Wolfram mathematica 通过Mathematica上传到ifile.it

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

我想知道是否有可能从Mathematica上传一个文件到ifile.it。我看过ifile的版本。但是,我仍然不知道它是如何工作的。此外,我在Mathematica中看到的最接近的示例是“”,但我不清楚如何使用该示例中的GET请求


提前感谢

设置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"
    }
  ]
]