2012-01-20 11 views
9

En el lado web de las cosas, tengo dos campos: nombre y documento. El documento es un campo de archivo, y el nombre es justo lo que el usuario quiere llamar al archivo en la aplicación.¿Cómo puedo cargar un archivo en mi aplicación ruby ​​on rails usando curl CLI?

Esto es lo que he intentado:

curl -F "media[document][email protected]" -F "media[name]=api" "http://example.com/medias/create.xml?api_key=123" 

pero me da un error InvalidAuthenticityToken. Este error solo se produce cuando intento cargar un archivo/crear un objeto multimedia. Los otros comandos API/xml funcionan (los que no incluyen archivos)

¿cuál es la forma correcta de cargar un archivo usando cURL?

EDIT: añadiendo -H "Content-Type: application/xml" al comando curl arriba, establecieron el servidor genera este error:

/!\ FAILSAFE /!\ Tue Jan 24 08:45:03 -0500 2012 
    Status: 500 Internal Server Error 
    #<REXML::ParseException: malformed XML: missing tag start 
Line: 
Position: 
Last 80 unconsumed characters: 
<:??OH?ɽ?H? ???g??yx~t????op?.$?????P&W ??"? 

normalmente el XML se suministra con el argumento -d. pero no creo que los archivos se puedan incluir en xml? tal vez ellos pueden? idk.

Respuesta

9

Si desea crear un archivo desde xml, debe formatear su xml para usar data, Base64 y/o CDATA, dependiendo de sus necesidades. Una vez que tiene un archivo xml correlacionado, solo tiene que enviarlo con curl.

Si solo desea cargar el archivo, no necesita utilizar una interfaz xml. Que sólo puede llamar a:

curl -F "media[document][email protected]/a.png;type=image/png" -F "media[name]=api" "http://example.com/medias/ 

para su problema de autentificación, si todavía lo tiene en esta url (no me encuentro en una nueva rieles 3.2.1 app fresca), se puede acceder a ella con un navegador habitual , obtenga la información de la cookie y envíela con curl. Esto significa que va a agregar a su comando:

--cookie "csrf-param=authenticity_token" --cookie "csrf-value=XXXXXXX" 

O utilizar un convenient script para enviar todos tus cookies de Firefox desde un host en rizo.

2

Necesita deshabilitar el token de autenticidad para la acción. Utilizar esto en su controlador (estoy suponiendo que la acción se denomina create):

protect_from_forgery :except => [:create] 

Esto sólo ocurre con POST, PUT o eliminar las solicitudes, que es probablemente la razón por la otra petición tienen éxito.

Si se trata de una API, querrá deshabilitarla por completo. Puede eliminar protect_from_forgery en usted ApplicationController.

El token de autenticidad se utiliza para (algo) asegurarse de que el usuario revisa el formulario al modificar los recursos. La aplicación crea un token aleatorio asociado a la sesión del usuario y lo coloca en un campo oculto del formulario. Cuando se envía el formulario, el token se compara con el almacenado en la sesión para realizar el control. Esto no tendrá ningún sentido en una API.

+0

es una aplicación web y una API. la mayoría de las otras acciones que usan el trabajo POST. pero hay algo raro con el archivo. No debería tener que deshabilitar pretect de falsificación si tengo una clave api, ¿verdad? – NullVoxPopuli

+0

Bueno, eso depende de cómo se implemente el mecanismo api_key, ya que no es algo que los rieles proporcionen de forma predeterminada. – aromero

+0

correcto, está usando restful_auth. http://www.justinbritten.com/work/2009/05/rails-api-authentication-using-restful-authentication/ – NullVoxPopuli

3

Rails usa authenticity token para evitar CSRF. Inserta un token especial calculado en función de la sesión del usuario actual en cada formulario y lo comprueba cuando llega la solicitud al servidor.

Cuando realiza una solicitud POST utilizando curl, obtiene ese error ya que no está pasando un token de autenticidad válido al servidor. Puede desactivar esa protección para usted Método así (nota, que la desactivación que hará que esta acción vulnerables a CSRF):

protect_from_forgery :except => :some_action 

o puede utilizar algunos ninjamagic a paso de testigo autenticidad válido en el servidor.

Otra opción se basa en el hecho de que Rails comprueba el token de autenticidad solo para solicitudes con ciertos tipos de contenido. Si se trata de una API y que está recibiendo la respuesta de JSON se puede intentar establecer el tipo de contenido de la solicitud de application/json así:

curl -H "Content-Type: application/json" ... 

Consulte estos enlaces para más información: one, two, three.

+0

pero estoy usando una clave API ... ¿no debería manejar esa autenticación? – NullVoxPopuli

+0

esto no funciona con la etiqueta -F en CURL. ¿Puedes proporcionar la sintaxis adecuada para subir el archivo con el tipo de contenido json o xml? – NullVoxPopuli

Cuestiones relacionadas