1

我正在尝试使用 curl 将文件上传到我的小型 Rub​​y 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 提交文件。
当我做 acurl -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 和 curl 的新手。我会很感激任何帮助。

谢谢!

4

2 回答 2

3

要上传文件,您必须模仿提交表单时发生的请求。
表单的动作定义为

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

这转化为

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

所以你应该发布到/save

第二点,Rails 自动在字段名称前加上传递给的对象名称form_for。如果您查看 的 HTML 源代码/insert,文件输入看起来像

<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]=@localfile.txt URL/save
于 2013-01-10T20:02:44.890 回答
2

我只是在这里猜测,但您POST可能无法通过,因为 Rails 需要csrf真实性令牌,而您的 curl 请求并未发送该真实性令牌。

在您看到结果的控制台中,POST可能有一条线说明了一些类似的内容WARNING: Cannot verify authenticity token.

当您使用 Rails 助手创建表单时,Rails 会自动创建一个隐藏字段,并为其值form_for生成一个标记。csrf这样,当表单提交时,如果表单中的令牌与 Rails 期望的令牌不匹配,则请求将失败。

您可以在此处阅读有关如何在 Rails 中使用 curl 的信息。

这是指向跨站点请求伪造的 Wikipedia 文章的链接。

另外,请让我知道这是否与您的问题有关。我只是假设这是原因,因为我之前尝试过使用 curl 发布并遇到同样的问题

于 2013-01-10T19:21:53.557 回答