Загрузить в ifile.it через Mathematica

Мне было интересно, можно ли загрузить файл из Mathematica в ifile.it. Я видел API ifile.it, однако я до сих пор не знаю, как это работает. Кроме того, самым близким примером, который я видел в Mathematica, является " Twittering with Mathematica, но мне не ясно, как я могу использовать GET запрос из этого примера.

Заранее спасибо

Ответ 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
*)

[email protected][method]  

(*
Out[5]= 200
*)

id = "server_id" /. ImportString[[email protected][], "JSON"]

(*
Out[6]= "55"
*)

Загрузите файл на сервер с помощью запроса POST, используя MultipartRequestEntity с 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", 
  [email protected][], file]

(*
Out[10]= JLink`Objects`vm1`JavaObject17546309972000769
*)

[email protected]["application/vnd.wolfram.mathematica"]

[email protected]["Filedata"]

entity = JavaNew[
  "org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity", 
{part}, [email protected][]]

(*
Out[13]= JLink`Objects`vm1`JavaObject22100383232950273
*)

[email protected][entity]

[email protected][method]

(*
Out[15]= 200
*)

ImportString[[email protected][], "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 получает очки за то, что он не был взломан, но вы также можете сделать это без 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/info/52338/more-complete-mutipartdata-posts-using-urlfetch/97658#97658)