2013-01-10 106 views
1

我正在嘗試使用curl將文件上傳到我的小型Ruby on Rails應用程序。curl在Ruby on Rails應用程序上傳文件

這裏是insert.html.haml

= form_for :my_result, :url=>{:action=> 'save'}, :html => {:multipart=>true} do |f| 
    = f.file_field :myfile 
    = submit_tag 'submit' 

提交表單時,「保存」操作將被調用。 但是,查看錶單的RoR操作是「插入」操作。

我可以用瀏覽器查看「插入」表單,然後提交我的文件沒有問題。

但我需要使用curl提交文件。
當我做curl -F [email protected] -F commit="submit" URL/insert時,我只能回到HTML中的「插入」表單。 它似乎沒有調用實際的「保存」操作。

Started POST "/my_results/insert" for 10.15.120.173 at 2013-01-10 10:53:22 -0800 
... 
Rendered my_results/insert.html.haml within layouts/application (2.9ms) 

我是新來的RoR和捲曲。我會很感激任何幫助。

謝謝!

+0

我相信你的問題是下面兩個答案的組合:csrf token authenticity和你的參數命名。 – nzifnab

回答

2

我只是在猜測這裏,但您的POST可能不會通過,因爲Rails需要一個csrf真實性標記,它不會與您的curl請求一起發送。

在你看到你的POST的結果有可能是當你使用Rails的助手如form_for創建一個表單,上面寫着沿WARNING: Cannot verify authenticity token.

東西行線控制檯,Rails會自動創建一個隱藏的字段,其值爲生成的csrf標記。這樣,當表單提交時,如果表單插入的令牌和Rails期望的令牌不匹配,請求將失敗。

你可以閱讀關於如何使用Rails here捲曲。

這是一個鏈接到維基百科文章Cross Site Request Forgery

此外,請讓我知道這是否與您的問題有關。我只是假設這是因爲我之前嘗試使用捲曲發佈並具有相同問題

3

要上傳文件,您必須模仿表單提交提交時發生的請求。
表單的動作定義爲

:url=>{:action=> 'save'} 

這transaltes到

<form action="/save" method="POST"> 

所以你應該張貼到/save

二點時,Rails自動的名稱前綴的字段名稱傳遞給form_for的對象。 如果你看看/insert的HTML源文件輸入看起來像

<input name="my_result[myfile]" type="file" /> 

這解釋了params哈希的結構:

{ 
    "my_result" => { 
    "my_file" => [the file] 
    } 
} 

允許params[:my_result]下訪問表單字段的值

總結:POST到/save並將該域名命名爲my_result[my_file]

curl -F my_result[my_file][email protected] URL/save