2014-09-29 48 views
0

在我的sinatra應用程序中,我正在使用以下curl命令在路由/test中發佈文件。如何從CURL參數中讀取文件數據?

curl -H "Content-Type: text/xml" -vv -X POST -d [email protected] 
     http://localhost:4567/test 

在我屈POST方法我要讀文件中像

post '/test' do 

    data = params[:file_data] #Here file_data param name of CURL command. 
end 

但是,在這裏dataNULL。我應該如何配置我的CURL命令來讀取file_data param中的文件?

+0

你應該使用'--data-binary @ test.xml' - 檢查出來http://curl.haxx.se/docs/manpage.html#--data-binary – 2014-09-29 06:14:05

+0

@PamioSolanky,不起作用。我仍然無法從file_data參數中讀取文件。 – Masudul 2014-09-29 06:18:45

+0

如果你只想'POST'這個文件,那麼你可以用'curl -H'Content-Type:text/xml「-i -F name = test -F [email protected] http:// localhost :4567/test' – 2014-09-29 07:57:11

回答

0

捲曲-F file_data = @ /一些/文件/上/你/本地/磁盤http://localhost:4567/test

從捲曲手冊:

-F, --form <name=content> 

(HTTP)這讓捲曲模擬填好的表格其中用戶已按下提交按鈕。這會導致根據RFC 2388使用Content-Type multipart/form-data捲曲POST數據。這樣可以上傳二進制文件等。要強制將「content」部分作爲文件,請在文件名前加上@符號。要從文件中獲取內容部分,請在文件名前加上符號<。 @和<之間的區別在於,@使文件作爲文件上傳附加在文章中,而<生成文本字段並從文件中獲取該文本字段的內容。

瞭解更多詳情:cURL manual

0

快速回答:刪除-H "Content-Type: text/xml",它應該工作。

的問題是,當發送文件時,Content-Type頭應該是multipart/form-data,這curl臺自動當您使用-F。從curls documentation

-F,--form (HTTP)這允許捲曲模擬填充在其中用戶已經按下的形式提交 按鈕。這將導致捲曲根據RFC 2388.透過此內容類型的multipart/form-data的數據這使的二進制文件等

但是,要覆蓋這個頭與-H上傳,所以您的應用程序期待這不是一個文件。

如果,除了與curl發送文件,您要包含它的類型信息,則應該這樣做:

curl -X POST -F "[email protected];type=text/xml" http://localhost:4567/test 

(內容類型自帶的文件名和一個分號之後。 )

要查看原始表單提交請求如何與multipart/form-data相似,請檢查this question的答案。