Ruby 写入 zip 文件适用于 Mac 但不适用于 windows / 如何在 Net::HTTP 中接收 zip 文件

Ruby writing zip file works on Mac but not on windows / How to recieve zip file in Net::HTTP

实际上我正在编写一个 ruby 脚本,它访问一个基于 HTTP-POST 调用的 API。 API return 是一个包含文本文档的 zip 文件,当我使用特定的 POST 参数调用它时。目前我正在使用 Net::HTTP 包。

现在我的问题是: 据我所知,return zip 文件似乎是一个字符串。我可以看到 "PK"(我想这是 zip 文件的 PK-Header 的一部分)和文档中的文本。

Content-Type Header 告诉我 "application/x-zip-compressed; name="somename.zip"".

当我像这样保存 zip 文件时:

result = comodo.get_cert("<somenumber>")
puts result['Content-Type']
puts result.inspect
puts result.body

File.open("test.zip", "w") do |file|
    file.write result.body
end

我可以在我的 macbook 上解压缩它而不会出现其他问题。但是当我 运行 我的 Win10 PC 上的相同代码时,它告诉我文件已损坏或不是 ZIP 文件。

跟编码有关系吗?我可以改变它吗,所以它对两者都有效? 还是关于如何从 POST-请求接收 zip 文件的完全错误的方法?

PS: 我在 Mac 上的 ruby 版本:

ruby 2.2.3p173

我在 Windows 上的 ruby 版本:

ruby 2.2.4p230

非常感谢!

问题是由于 Windows 处理行尾的方式(\r\n 用于 Windows,而 OS X 和其他基于 Unix 的操作系统仅使用 \n).当使用 File.open 时,使用 w 模式会使文件受到行尾更改的影响,因此任何出现的字节 0x0A(或 \n)都将转换为字节 0x0D 0x0A(或 \r\n), 这有效地打破了压缩。

打开文件进行写入时,请改用 wb 模式,因为这会抑制任何行结束更改。

http://ruby-doc.org/core-2.2.0/IO.html#method-c-new-label-IO+Open+Mode

非常感谢!正如您发布的解决方案,我自己找到了..

少了一个很麻烦'b' :/

非常感谢!

解决方法(见):

result = comodo.get_cert("<somenumber>")
puts result['Content-Type']
puts result.inspect
puts result.body

File.open("test.zip", "wb") do |file|
    file.write result.body
end