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

时间:2016-03-29 21:55:40

标签: ruby windows macos zip net-http

实际上我正在编写一个ruby脚本,它根据HTTP-POST调用访问API。 当我使用特定的POST参数调用它时,API会返回一个包含textdocuments的zip文件。目前我正在使用Net :: HTTP Package。

现在我的问题: 据我所知,似乎将zip文件作为字符串返回。我可以看到" PK" (我认为它是压缩文件的PK-Header的一部分)和文档中的文本。

Content-Type Header告诉我" application / x-zip-compressed;名称=" 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

非常感谢提前!

2 个答案:

答案 0 :(得分:0)

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

打开要写入的文件时,请使用模式\r\n,因为这会抑制任何行结束更改。

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

答案 1 :(得分:0)

非常感谢!正如你发布解决方案我发现它自己..

由于一个人失踪而导致很多麻烦&#39; b&#39; :/

非常感谢!

解决方案(参见Ben Y's answer):

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