2011-05-02 14 views
13

Me preguntaba si es posible cargar un archivo desde Mathematica a ifile.it. He visto el API de ifile.it, sin embargo, todavía no sé cómo funciona. Además, el ejemplo más cercano que he visto en Mathematica es 'Twittering with Mathematica', pero no está claro para mí, ¿cómo puedo usar una solicitud GET de ese ejemplo?Cargar a ifile.it a través de Mathematica

Gracias de antemano

+0

Si entiendo bien la descripción de la API , necesitarás HTTP POST también. En el blog de Ragfield en Twitter encontrarás un enlace a Twitter.m que contiene una función HTTPPost. Tal vez puedes usar eso? Le enviaré un correo electrónico a Ragfield para que haga su pregunta bajo su atención. –

+0

@Sjoerd: Muchas gracias. Espero con ansias saber su respuesta. En cuanto a usar la solicitud de Http Post, lo intentaré. –

Respuesta

17

Configure la biblioteca de Java HttpClient.

<< JLink` 

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

Determine qué servidor usar.

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

cargar el archivo en el servidor con una solicitud POST utilizando un MultipartRequestEntity con un FilePart. respuesta

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

¡Funciona muy bien! Muchas gracias. ¡Ahora tendré que analizar tu código para saber cómo funciona! –

+0

¡Eso fue rápido! Algunas preguntas: ¿qué modificaciones serían necesarias para transmitir archivos binarios en lugar de un cuaderno de Mathematica que es simple ASCII? ¿Cambia solo el campo de tipo de contenido o es una codificación a, p. base64 usando InputString o tan necesario? –

+1

@ sjoerd-c-de-vries Esto también funciona con archivos binarios, no es necesaria ninguna codificación adicional. Solo asegúrese de usar el tipo MIME correcto (por ejemplo, image/jpeg). – ragfield

0

de ragfield obtiene puntos por no ser un truco, pero también se puede hacer esto sin 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-respondió desde https://mathematica.stackexchange.com/questions/52338/more-complete-mutipartdata-posts-using-urlfetch/97658#97658)

Cuestiones relacionadas