2011-05-02 38 views
13

我想知道是否可以從Mathematica上傳文件到ifile.it。我已經看到了ifile.it的API,但是,我仍然不知道它是如何工作的。此外,我在Mathematica中看到的最接近的例子是'Twittering with Mathematica',但我不清楚,我怎樣才能使用來自該例子的GET請求。通過Mathematica上傳到ifile.it

在此先感謝

+0

如果我理解的API描述以及,你也需要HTTP POST。在Ragfield的Twitter博客中,您會發現一個包含HTTPPost函數的Twitter.m鏈接。也許你可以使用那個?我會給拉格菲爾德發郵件,提出他的問題。 – 2011-05-02 20:12:16

+0

@Sjoerd:非常感謝。我期待知道他的答案。至於使用Http Post請求,我會試一試。 – 2011-05-02 21:59:16

回答

17

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

上傳文件到與使用MultipartRequestEntity與FilePart 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", 
    [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"} 
*) 
+1

工程太棒了!非常感謝你。現在我將不得不分析你的代碼,以瞭解它是如何工作的! – 2011-05-02 22:16:06

+0

太快了!幾個問題:傳輸二進制文件而不是Mathematica筆記本電腦需要進行哪些修改才能傳輸二進制文件?你只是改變內容類型的字段,或者是一個編碼base64使用InputString或必要的? – 2011-05-03 07:14:08

+1

@ sjoerd-c-de-vries這也適用於二進制文件,不需要進一步的編碼。只要確保使用正確的MIME類型(例如image/jpeg)。 – ragfield 2011-05-03 14:05:27

0

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跨回答)