1

zip 出力ストリームを生成するコードがあり、サーブレットの応答ストリームを介してそのストリームを送信します。Mac で開発中のテストではすべて正常に動作しますが、サーバー (RHEL) にコードを配置すると、zip アーカイブが破損しているように見えます。jar を使用してファイルの内容を一覧表示しようとすると、次のようになります。

java.util.zip.ZipException: zip ファイルを開く際のエラー

しかし奇妙なことに、jar を使用してアーカイブを抽出すると機能します (ただし、他の unarchiver は失敗します)。

さらにテストするために、zip ファイルの内容が私の Mac と RHEL からのものとまったく同じであることを確認しました。どちらの場合も、zip ファイルのサイズはまったく同じでしたが、ハッシュ (MD5) が異なっていました。

前述したように、zip ファイルを生成するコードと内容はまったく同じであるため、何が起こっているのかわかりません。プラットフォームの 1 つで動作しているため、zip ファイルの作成は正しいと確信しています。RHEL サーバーで zip ファイルを生成する際に問題が発生する兆候はありません。

考え?助けてくれてありがとう。

編集:これがコードです...

// first add the kml document
ZipOutputStream stream = new ZipOutputStream(response.getOutputStream());
stream.putNextEntry(new ZipEntry("doc.kml"));
stream.write(kml.getBytes(), 0, kml.length());
stream.closeEntry();

File image = null;
byte[] bytes = null;
FileInputStream fstream = null;

// include the images for each type
File images = new File("/tmp/images");
String filename = null;

for(Type type: types) {
  filename = type.getName() + ".png";
  image = new File(images, filename);
  bytes = new byte[(int)image.length()];

  fstream = new FileInputStream(image);
  fstream.read(bytes);

  stream.putNextEntry(new ZipEntry(filename));
  stream.write(bytes);
  stream.closeEntry();

  fstream.close();
}

stream.finish();
stream.flush();
stream.close();

EDIT2: プロットが厚くなります。アーカイブにイメージが 1 つしかない限り、RHEL zip ストリームは問題ないようです。うまくいけば、Googleが私を助けるのにこれで十分です。

4

1 に答える 1

2

いくつかの問題:

  • を使用して文字列をバイトに変換しないでくださいgetBytes()。これはプラットフォームの文字セットを使用しますが、これはプラットフォームによって異なる場合があります。常に明示的な文字セットを使用しgetBytes("UTF-8")ます。また、getBytes() から返される長さは、文字列の長さとは無関係です。
  • ファイルを読み取るときは、ファイル全体をメモリに読み込まないでください (これはスケーリングしません)。固定サイズの byte[] と while ループを使用して、InputStream と OutputStream の間でコピーします。このコードの例はオンラインで何千もあります。(または commons io のようなものを使用しますIOUtils.copy
  • 前の点に関連し、InputStream.read()戻り値があります。無視しないでください。繰り返しますが、これは、InputStream を OutputStream にコピーする最良の方法を示す例で見られるはずです。
于 2012-06-08T18:23:38.340 に答える