6

マルチパートフォームにrestclientを使用して、データをRESTful Webサービス(Pandaビデオエンコーディングサービス)に送信しています。ただし、トリックは、restclient(Technoweenieブランチ)に渡すファイルが、ユーザーが送信する自分のフォームからのものであるということです。

それでは、これを見ていきましょう。ユーザーが私のRailsアプリにファイルを投稿します。私のコントローラーでは、params [:file]からファイルを受け取ります。次に、RestClientを使用してparams [:file]をPandaに渡します。

私が得ているエラーは、パンダサーバーにあります。スタックトレースのファイルパラメータも文字列に含まれていることに気付きました(これは、Pandaがより良いスタックトレースの文字列に変わると思います)。

 ~ Started request handling: Wed Aug 12 18:05:15 +0000 2009
 ~ Params: {"format"=>"html", "multipart"=>"true", "account_key"=>"SECURE_KEY", "action"=>"upload", "id"=>"SECURE_ID", "controller"=>"videos", "file"=>"#<File:0xcf02ca4>"}
 ~ 9bfb1750-6998-012c-4509-12313900b0f6: (500 returned to client) InternalServerErrorcan't convert nil into String
/var/local/www/panda/app/models/video.rb:246:in `extname'
/var/local/www/panda/app/models/video.rb:246:in `initial_processing'
/var/local/www/panda/app/controllers/videos.rb:79:in `upload'
4

3 に答える 3

1

RailsからrestclientにCGIスタイルのアップロードパラメータを実際に渡して、それが機能することを期待できるとは思えません。

Railsでの通常のアップロードには、投稿されたリソースに属さないかなりの追加属性(元のファイル名など)があり、Railsアップロードには実際のファイルデータを含むIOが含まれます。また、Railsのファイルアップロードオブジェクトは、アップロードのサイズに応じて、Tempfileハンドルであり、StringIOである可能性があります。

効果的に行う必要があるのは、rest-clientが適切に処理するためにアップロードを「再パッケージ化」し、再パッケージ化されて巻き戻されたTempfileオブジェクトをrestclientに渡すことです。params [:file]全体ではなく、アップロードオブジェクト自体を選択するだけで解決できるかもしれません。

于 2009-08-13T02:54:28.113 に答える
0

問題は rest-client によるファイルの投稿にあるようです。curb などの別の投稿方法を確認してください。

この質問にマルチパート フォーム データを投稿するための多くの例: Ruby: How to post a file via HTTP as multipart/form-data?

于 2009-08-12T19:27:43.033 に答える