6

我正在使用 restclient 的多部分表单将数据发送到一个安静的 Web 服务(它是 Panda 视频编码服务)。不过,诀窍是我传递给 restclient(Technoweenie 分支)的文件来自我自己的用户提交的表单。

所以,让我们来看看这个。用户将文件发布到我的 rails 应用程序。在我的控制器中,它从 params[:file] 接收文件。然后我想使用 RestClient 将 params[:file] 传递给 Panda。

我得到的错误出现在 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

确认您的 restclient 操作可以先在本地保存。如果操作无法在本地保存,那么您将更好地了解在排除故障时查看的位置。

于 2009-08-12T20:09:13.260 回答
1

我怀疑您是否真的可以将 CGI 样式的上传参数从 Rails 传递到 restclient 并期望它能够工作。

Rails 中的常规上传会有相当多的额外属性,这些属性不属于已发布的资源(如原始文件名等),Rails 上传包含带有实际文件数据的 IO。此外,Rails 中的文件上传对象可能是 Tempfile 句柄,也可能是 StringIO - 取决于上传的大小。

您实际上需要做的是“重新打包”您的上传以供 rest-client 正确处理,并将重新打包和重绕的 Tempfile 对象传递给 restclient。也许你可以选择上传对象本身而不是整个 params[:file]

于 2009-08-13T02:54:28.113 回答
0

看起来问题出在rest-client的文件发布上,请查看另一种发布方法,例如遏制。

在这个问题上发布多部分表单数据的很多例子:Ruby: How to post a file via HTTP as multipart/form-data?

于 2009-08-12T19:27:43.033 回答