curl在Ruby on Rails应用程序上上传文件

时间:2013-01-10 19:10:25

标签: ruby-on-rails ruby curl

我正在尝试使用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和卷发的新手。我很感激任何帮助。

谢谢!

2 个答案:

答案 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并遇到同样的问题