gpt4 book ai didi

ruby - Ruby 中的分段文件上传

转载 作者:数据小太阳 更新时间:2023-10-29 06:58:41 25 4
gpt4 key购买 nike

我只想使用 POST 将图像上传到服务器。这个任务听起来很简单,但在 Ruby 中似乎没有简单的解决方案。

在我的应用程序中,我使用 WWW::Mechanize对于大多数事情,所以我也想将它用于此,并且有这样的来源:

f = File.new(filename, File::RDWR)
reply = agent.post(
'http://rest-test.heroku.com',
{
:pict => f,
:function => 'picture2',
:username => @username,
:password => @password,
:pict_to => 0,
:pict_type => 0
}
)
f.close

这会在服务器上产生一个完全垃圾就绪的文件,看起来到处乱七八糟:

alt text http://imagehub.org/f/1tk8/garbage.png

我的下一步是将 WWW::Mechanize 降级到 0.8.5 版。这一直有效,直到我尝试运行它,但失败并出现“在 hpricot_scan.so 中找不到模块”之类的错误。使用 Dependency Walker 工具我可以发现 hpricot_scan.so 需要 msvcrt-ruby18.dll。然而,在我将该 .dll 放入我的 Ruby/bin 文件夹后,它给了我一个空的错误框,从那里我无法进一步调试。所以这里的问题是 Mechanize 0.8.5 依赖于 Hpricot 而不是 Nokogiri(可以完美运行)。


下一个想法是使用不同的 gem,所以我尝试使用 Net::HTTP。经过简短的研究后,我发现 Net::HTTP 中没有对多部分表单的原生支持,相反,您必须构建一个为您编码等的类。我能找到的最有帮助的是 Multipart-class by Stanislav Vitvitskiy .这个类到目前为止看起来不错,但它没有满足我的需要,因为我不想发布 only 文件,我还想发布正常数据,而这对他的类来说是不可能的.


我最后一次尝试是使用 RestClient .这看起来很有希望,因为已经有关于如何上传文件的示例。但是我无法将表单作为多部分发布。

f = File.new(filename, File::RDWR)
reply = RestClient.post(
'http://rest-test.heroku.com',
:pict => f,
:function => 'picture2',
:username => @username,
:password => @password,
:pict_to => 0,
:pict_type => 0
)
f.close

我正在使用 http://rest-test.heroku.com如果发送正确,它会发回调试请求,我总是会得到这个:

POST http://rest-test.heroku.com/ with a 101 byte payload,content type application/x-www-form-urlencoded{    "pict" => "#<File:0x30d30c4>",    "username" => "s1kx",    "pict_to" => "0",    "function" => "picture2",    "pict_type" => "0",    "password" => "password"}

这清楚地表明它没有使用 multipart/form-data 作为内容类型,而是使用标准的 application/x-www-form-urlencoded,尽管它肯定看到 pict 是一个文件。


如何在不自己实现整个编码和数据对齐的情况下将 Ruby 中的文件上传到多部分表单?

最佳答案

问题很长,答案很短:我缺少在 Windows 下读取图像的二进制模式。

f = File.new(文件名, File::RDWR)

必须是

f = File.new(文件名, "rb")

关于ruby - Ruby 中的分段文件上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/959107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com