【问题标题】:Upload to ifile.it through Mathematica通过 Mathematica 上传到 ifile.it
【发布时间】:2011-08-16 17:23:11
【问题描述】:

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

提前致谢

【问题讨论】:

  • 如果我理解 API 描述,你也需要 HTTP POST。在 Ragfield 的 Twitter 博客中,您会找到一个指向 Twitter.m 的链接,其中包含一个 HTTPPost 函数。也许你可以使用那个?我会向 Ragfield 发送电子邮件,让他注意到你的问题。
  • @Sjoerd:非常感谢。我期待知道他的回答。至于使用Http Post请求,我试试看。

标签: wolfram-mathematica


【解决方案1】:

设置 Java HttpClient 库。

<< JLink`

client = JavaNew["org.apache.commons.httpclient.HttpClient"]
(*
Out[3]= JLink`Objects`vm1`JavaObject17955866594508801
*)

确定要使用的服务器。

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"
*)

使用带有 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"}
*)

【讨论】:

  • 效果很好!非常感谢。现在我将不得不分析您的代码以了解它是如何工作的!
  • 太快了!几个问题:传输二进制文件而不是纯 ASCII 的 Mathematica 笔记本需要哪些修改?您是否仅更改内容类型字段或编码为例如base64 使用 InputString 还是有必要的?
  • @sjoerd-c-de-vries 这也适用于二进制文件,无需进一步编码。只需确保使用正确的 MIME 类型(例如 image/jpeg)。
  • 编辑了代码,以便可以将其复制到 Mma 中。希望你不介意
【解决方案2】:

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

(来自https://mathematica.stackexchange.com/questions/52338/more-complete-mutipartdata-posts-using-urlfetch/97658#97658的交叉回答)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 2017-10-02
    • 2012-05-17
    • 2020-03-27
    • 2015-06-16
    • 2021-05-27
    • 1970-01-01
    相关资源
    最近更新 更多