Zip文件在接收时损坏

时间:2017-12-20 10:23:04

标签: java php zip

我有一个生成zip文件的PHP脚本。

生成的zip文件在通过浏览器下载时会打开文件。

我已经制作了一个Java服务来测试这个PHP脚本是人们可以用Java代码接收zip文件。

当我将收到的Java代码复制到zip文件中时,我收到一条消息,说zip文件已损坏。

有人可以提供建议吗。

谢谢。

PHP代码

export default function bar(WrappedComponent) {
   return class Bar extends WrappedComponent {

      funcFromHoc() {
         alert("Hello from HOC function!");
      }

      render() {
         return (
            //call super.list() here to populate drawer list
            {super.render()}
         );
      }
   }
}

JAVA CODE:

 $zip = new ZipArchive();
    $filename = "labels.zip";

    $fileArray = array();
    if ($zip->open($filename, ZipArchive::CREATE)!==TRUE) {
        exit("cannot open <$filename>\n");
    }

    foreach ($labelPaths as $labelPath) {
        $zip->addFile($labelPath);
    }
    $zip->close();

    header($_SERVER['SERVER_PROTOCOL'].' 200 OK');
    header("Content-Type: application/zip");
    header("Content-Transfer-Encoding: Binary");
    header("Content-Length: ".filesize($filename));
    header("Content-Disposition: attachment; filename=\"".basename($filename)."\"");
    readfile($filename);

1 个答案:

答案 0 :(得分:1)

这将是你的问题:

    String line;
    StringBuffer response = new StringBuffer();
    while((line = rd.readLine()) != null) {
        response.append(line);
        response.append('\r');
    }

上述方法适用于从输入流中读取字符串,但您正在读取ZIP文件的二进制数据并将其视为字符串。然后将该字符串打印到控制台,然后将其复制到文本文件中 - 那里有很多失败点!

上述过程实际上是行不通的。

这几乎肯定会因为该过程的每个步骤中的编码问题而失败,如果没有别的,此外你还要在每个换行符中插入\ r \ n字符(这也是错误的。)

相反,您只想将数据视为字节,并使用字节数组作为缓冲区(而不是字符串)将其直接泵入文件:

try(FileOutputStream out = new FileOutputStream(outFile)) {
    byte[] buffer = new byte[1024];
    int read;
    while ((read = inputStream.read(buffer)) != -1) {
        out.write(buffer, 0, read);
    }
}