如何从CURL参数中读取文件数据?

时间:2014-09-29 06:08:02

标签: ruby-on-rails ruby curl sinatra

在我的sinatra应用程序中,我使用以下curl命令在路由/test中发布文件。

curl -H "Content-Type: text/xml" -vv -X POST -d file_data=@test.xml 
        http://localhost:4567/test

在我的Sinatra post方法中,我想要读取文件,如

post '/test' do

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

但是,此处dataNULL。如何配置CURL命令以从file_data param读取文件?

2 个答案:

答案 0 :(得分:0)

curl -F file_data = @ / some / file / on / your / local / disk http://localhost:4567/test

来自cURL手册:

-F, --form <name=content>

(HTTP)这使curl模拟用户按下提交按钮的填写表单。这会根据RFC 2388使用Content-Type multipart / form-data导致curl POST数据。这样可以上传二进制文件等。要强制'content'部分为文件,请在文件名前加上@符号。要从文件中获取内容部分,请在文件名前加上符号&lt;前缀。 @和&lt;之间的区别然后,@使文件作为文件上传附加在帖子中,而&lt;创建一个文本字段,然后从文件中获取该文本字段的内容。

了解更多详情:cURL manual

答案 1 :(得分:0)

快速回答:删除-H "Content-Type: text/xml",它应该有效。

问题在于,当发送文件时,Content-Type标题应为multipart/form-datacurl在您使用-F时会自动设置-H。来自curls documentation

  

-F, - 表格                 (HTTP)这使curl模拟用户按下提交的填写表单                 按钮。这会根据RFC 2388使用Content-Type multipart / form-data导致curl POST数据。这样可以上传二进制文件等。

但是,您使用curl覆盖此标头,因此您的应用期望某些内容不是文件。

如果除了使用curl -X POST -F "file_data=@test.xml;type=text/xml" http://localhost:4567/test 发送文件之外,您想要包含有关其类型的信息,您应该这样做:

multipart/form-data

(内容类型位于文件名和分号之后。)

要查看原始表单提交请求最终如何与w = 0; for i = 1:k for j = 1:N(i) x_diff = x(i,j) - mean(x(i,:)); w = w + (x_diff * x_diff^T); end end b = 0; for i = 1:k x_diff = mean(x(i,:)) - mean(x); b = b + (N(i) * x_diff * x_diff^T); end 一样,请查看this question的答案。