2012-01-20 56 views
9

在網絡的一面,我有兩個字段:名稱和文檔。文檔是一個文件字段,名稱就是用戶想要在應用程序中調用該文件的內容。如何使用curl CLI將文件上傳到Rails應用程序的ruby中?

這是我曾嘗試:

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

,但我得到一個錯誤InvalidAuthenticityToken。 僅當我嘗試上載文件/製作媒體對象時,纔會出現此錯誤。其他API/xml命令工作(不涉及文件的)

使用cURL上傳文件的正確方法是什麼?

編輯: 加入-H「內容類型:應用/ xml」的上述捲曲命令使服務器產生這樣的錯誤:

/!\ 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 ??"? 

通常的XML被使用-d參數提供。但我不認爲文件可以包含在XML中?也許他們可以? IDK的。

回答

9

如果你想從xml創建文件,你應該根據你的需要格式化你的xml以使用data,或者Base64和/或CDATA。一旦你有一個格式正確的XML文件,你只需要用curl發送它。

如果你只是想上傳文件,你不需要使用xml接口。你可以叫:

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

爲了您的認證問題,如果你仍然有它在這個URL(我沒有遇到它一個新的Rails 3.2.1新鮮的應用程序),你可以用普通的瀏覽器訪問,獲取cookie信息並用curl發送。這意味着你將添加到您的命令:

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

或者使用convenient script從一個主機發送所有當前的Firefox餅乾到捲曲。

2

您需要爲操作禁用真實性標記。在你的控制器使用這個(我假設的動作被命名爲create):

protect_from_forgery :except => [:create] 

這僅發生POST,PUT或DELETE請求,這可能是爲什麼其他的請求是成功的。

如果這是一個API,你會想完全禁用它。您可以刪除protect_from_forgeryApplicationController

真實性標記用於(有點)確保用戶在修改資源時瀏覽表單。應用程序創建與用戶會話關聯的隨機令牌,並將其放置在窗體的隱藏字段中。當表單被提交時,令牌與存儲在會話中的令牌進行比較以進行檢查。這在API中沒有任何意義。

+0

這是一個網絡應用程序和API。大部分使用POST工作的其他操作。但是這個文件有些奇怪。如果我有一個API密鑰,我不應該禁用僞造文件,對吧? – NullVoxPopuli

+0

那麼,這取決於如何實現api_key機制,這聽起來不像rails默認提供的東西。 – aromero

+0

對,它使用restful_auth。 http://www.justinbritten.com/work/2009/05/rails-api-authentication-using-restful-authentication/ – NullVoxPopuli

3

Rails使用authenticity token來防止CSRF。它將基於當前用戶會話計算的特殊標記插入到每個表單中,並在請求到達服務器時進行檢查。

當您使用curl執行POST請求你的錯誤,你不是在傳遞有效的真實性令牌服務器。您可以禁用保護你的方法那樣(注,,禁用它會做出這個動作容易對CSRF):

protect_from_forgery :except => :some_action 

,或者你可以使用一些ninjamagic到有效的真實性令牌傳遞到服務器。

另一個選擇是基於Rails只對具有特定內容類型的請求檢查真實性標記的事實。如果它是一個API和你得到的JSON響應,您可以嘗試請求的內容類型設置爲application/json這樣的:

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

請參見以下鏈接瞭解更多信息:onetwothree

+0

但我使用的API密鑰...不應該爲我處理身份驗證? – NullVoxPopuli

+0

這不適用於CURL中的-F標記。你能提供正確的語法來上傳帶有json或xml內容類型的文件嗎? – NullVoxPopuli

相關問題