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
实际上我正在编写一个 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