我正在尝试使用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 myfile=@localfile.txt -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 :(得分:3)
要上传文件,您必须模仿表单提交时发生的请求。
表单的操作定义为
:url=>{:action=> 'save'}
转换为
<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]
总结:发布到/save
并将字段命名为my_result[my_file]
:
curl -F my_result[my_file]=@localfile.txt URL/save
答案 1 :(得分:2)
我只是在这里猜测,但由于Rails需要POST
真实性令牌而你的csrf
可能没有通过,因为你的curl请求没有发送POST
真实性令牌。
在您看到WARNING: Cannot verify authenticity token.
结果的控制台中,可能会有一行显示form_for
使用诸如csrf
之类的Rails帮助程序创建表单时,Rails会自动创建一个隐藏字段,其中包含生成的{{1}}令牌。这样,当表单提交时,如果带有表单的令牌和Rails期望的令牌不匹配,请求将失败。
您可以通过Rails here了解如何使用curl。
以下是Cross Site Request Forgery上维基百科文章的链接。
另外,如果这与您的问题完全相关,请与我们联系。我只是假设这是因为我之前尝试使用curl进行POST并遇到同样的问题