2016-03-29 9 views
-1

実際には、HTTP-POST呼び出しに基づいてAPIにアクセスするRubyスクリプトを作成しています。 APIは、特定のPOSTパラメータで呼び出すときにtextdocumentsを含むzipファイルを返します。現時点では、私はNet :: HTTPパッケージでそれをやっています。ルビー書き込みzipファイルはMacでは動作しますが、Windowsでは動作しません。Net :: HTTPでZIPファイルを受け取る方法

今私の問題: 私が知る限り、zipファイルを文字列として返すようです。私は "PK"(私はZIPファイルのPKヘッダの一部であると思われる)とその文書からのテキストを見ることができます。

そして、Content-Typeヘッダーは "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 2.2.3p173 

Windows上で私のルビーバージョン:事前に

ruby 2.2.4p230 

多くの感謝!

答えて

0

問題は、Windowsが行末を処理する方法(Windowsの場合は\r\nですが、OS Xやその他のUnixベースのオペレーティングシステムの場合は\nのみを使用するためです)。 File.openを使用すると、ちょうどwのモードを使用するとファイルの行末の変更が行われるため、バイト0x0A(または\n)が0x0D 0x0A(または\r\n)のバイトに変換され、結果的にzipが効果的に破棄されます。

書き込み用にファイルを開くときは、代わりにモードwbを使用してください。行末の変更が抑制されるためです。

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

0

多くの感謝!/

はどうもありがとうございました:あなたは解決策を掲載同じように、私は理由1の

そんなにトラブルは「B」を欠落している...それを自分自身を発見しました!

溶液(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 
関連する問題