Upload to ifile.it through Mathematica

后端 未结 2 2054
再見小時候
再見小時候 2020-12-05 08:15

I was wondering whether it\'s possible to upload a file from Mathematica to ifile.it. I have seen the API of ifile.it, however, I still don\'t know how it works. Furthermore

相关标签:
2条回答
  • 2020-12-05 08:56

    Setup the Java HttpClient library.

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

    Determine which server to use.

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

    Upload the file to the server with a POST request using a MultipartRequestEntity with a 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", 
      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"}
    *)
    
    0 讨论(0)
  • 2020-12-05 09:00

    ragfield's answer gets points for not being a hack, but you can also do this without 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"
        }
      ]
    ]
    

    (Cross-answered from https://mathematica.stackexchange.com/questions/52338/more-complete-mutipartdata-posts-using-urlfetch/97658#97658)

    0 讨论(0)
提交回复
热议问题