2012-01-20 9 views
9

Sul lato web delle cose, ho due campi: nome e documento. Il documento è un campo file e il nome è proprio ciò che l'utente desidera chiamare il file nell'app.Come posso caricare un file sul mio ruby ​​sull'app rails utilizzando la CLI curl?

Ecco che cosa ho provato:

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

ma ottengo un errore InvalidAuthenticityToken. Questo errore si verifica solo quando provo a caricare un file/creare un oggetto multimediale. Gli altri comandi API/xml funzionano (quelli che non riguardano i file)

qual è il modo corretto di caricare un file utilizzando cURL?

EDIT: aggiungendo -H "Content-Type: application/xml" al comando ricciolo sopra rendere il server genera questo errore:

/!\ 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 l'XML viene fornito utilizzando l'argomento -d. ma non penso che i file possano essere inclusi in xml? forse possono? idk.

risposta

9

Se si desidera creare un file da xml, è necessario formattare il proprio xml per utilizzare data, sia Base64 e/o CDATA, in base alle proprie esigenze. Una volta che hai un file xml corretly formattato, devi solo inviarlo con curl.

Se si desidera solo caricare il file, non è necessario utilizzare un'interfaccia xml. Si può solo chiamare:

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

per il vostro problema autenticazione, se avete ancora su questo url (non incontrare su un nuovo rotaie 3.2.1 fresco app), è possibile accedere con un normale browser , ottenere le informazioni sui cookie e inviarli con il ricciolo. Ciò significa che si aggiungerà al comando:

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

Oppure utilizzare un convenient script per inviare tutti i tuoi attuali cookie di Firefox da un host in ricciolo.

2

È necessario disabilitare il token di autenticazione per l'azione. Utilizzare questo nel controller (sto assumendo l'azione prende il nome create):

protect_from_forgery :except => [:create] 

Questo accade solo con POST, PUT o DELETE richieste, che è probabilmente il motivo altra richiesta hanno successo.

Se si tratta di un'API, è necessario disabilitarla completamente. È possibile rimuovere protect_from_forgery in voi ApplicationController.

Il token di autenticità viene utilizzato per (in qualche modo) garantire che l'utente passi attraverso il modulo durante la modifica delle risorse. L'applicazione crea un token casuale associato alla sessione utente e lo inserisce in un campo nascosto del modulo. Quando viene inviato il modulo, il token viene confrontato con quello archiviato nella sessione per effettuare il controllo. Questo non ha alcun senso in un'API.

+0

è un'app Web e un'API. la maggior parte delle altre azioni che usano il POST funzionano. ma c'è solo qualcosa di strano nel file. Non dovrei disabilitare il pretesto dalla contraffazione se ho una chiave API, giusto? – NullVoxPopuli

+0

Bene, questo dipende da come viene implementato il meccanismo api_key, suona come non è qualcosa che le rotaie fornisce di default. – aromero

+0

a destra, sta usando restful_auth. http://www.justinbritten.com/work/2009/05/rails-api-authentication-using-restful-authentication/ – NullVoxPopuli

3

Rails utilizza authenticity token per impedire CSRF. Inserisce un token speciale calcolato in base alla sessione dell'utente corrente in ogni modulo e lo controlla quando la richiesta arriva al server.

Quando si esegue la richiesta POST utilizzando l'arricciatura si ottiene quell'errore poiché non si passa un token di autenticità valido al server. È possibile disattivare tale protezione per voi il metodo del genere (si noti, che la disattivazione farà questa azione vulnerabile per CSRF):

protect_from_forgery :except => :some_action 

oppure è possibile utilizzare alcuni ninjamagic passare gettone valido autenticità al server.

Un'altra opzione si basa sul fatto che Rails controlla il token di autenticità solo per le richieste con determinati tipi di contenuto. Se si tratta di un'API e si stanno ottenendo risposta in JSON si può provare a impostare il tipo di contenuto della richiesta di application/json così:

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

vedere questi link per ulteriori informazioni: one, two, three.

+0

ma sto usando una chiave API ... non dovrebbe gestire l'autenticazione per me? – NullVoxPopuli

+0

questo non funziona con il tag -F in CURL. puoi fornire la sintassi corretta per caricare il file con il tipo di contenuto json o xml? – NullVoxPopuli

Problemi correlati