1

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とcurlが初めてです。助けていただければ幸いです。

ありがとう!

4

2 に答える 2

3

ファイルをアップロードするには、フォームの送信時に発生するリクエストを模倣する必要があります。
フォームのアクションは次のように定義されます。

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

これはに変換されます

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

だからあなたはに投稿する必要があります/save

2 番目の点として、Rails は、フィールド名の前に、渡されたオブジェクトの名前を自動的に付けますform_for。の HTML ソースを見ると/insert、ファイル入力は次のようになります。

<input name="my_result[myfile]" type="file" />

paramsこれはハッシュの構造を説明しています:

{
  "my_result" => {
    "my_file" => [the file]
  }
}

以下のフォームフィールドの値にアクセスできますparams[:my_result]

要約する/saveと、フィールドに POST して名前を付けますmy_result[my_file]

curl -F my_result[my_file]=@localfile.txt URL/save
于 2013-01-10T20:02:44.890 に答える
2

ここで推測しているだけですが、POSTRails が認証トークンを必要とするためcsrf、curl リクエストで送信されていないため、おそらく成功していません。

の結果が表示されるコンソールにPOSTは、おそらく次の行に沿って何かを言う行がありますWARNING: Cannot verify authenticity token.

などの Rails ヘルパーを使用してフォームを作成すると、Railsはその値に対して生成されたトークンをform_for含む非表示フィールドを自動的に作成します。csrfそうすれば、フォームが送信されたときに、フォームに含まれるトークンと Rails が期待するトークンが一致しない場合、リクエストは失敗します。

Rails で curl を使用する方法については、こちらを参照してください。

クロス サイト リクエスト フォージェリに関するウィキペディアの記事へのリンクを次に示します。

また、これがあなたの問題に関係があるかどうかもお知らせください。以前にcurlでPOSTを試みて同じ問題を抱えていたので、それが原因だと思います

于 2013-01-10T19:21:53.557 に答える