PCLZIP会创建一个被Gmail阻止的zip,因为它被错误地解释为包含可执行文件的zip

时间:2014-05-24 07:03:24

标签: php pclzip

我正在使用PCLZIP创建包含少量文档和pdf的ZIP。在某些机器上,用户声称zip已损坏。

在我的机器上,我没有看到ZIP损坏,但每当我尝试通过Gmail发送该邮件时,它会阻止ZIP说它包含可执行文件,但实际上所有的zip文件都是PDF文件。所以我看到人们声称zip已损坏,Gmail阻止从我们的应用程序创建这些zip的关系。

我尝试提取所有文件,然后使用Window的“添加到存档”选项再次将它们添加到zip中。如果我发送这个zip,gmail就不会阻止。

所以我相信在我的PHP应用程序中创建ZIP时会出现一些问题。

以下是我创建ZIP的代码的相关部分:

<?php 

$archive = new PclZip("exportZIPs/{$randomFileName}.zip");
$orgFile = $document->sAbsStoragePath.$document->sSysFileName;

$filePath = array();

$filePath[] = array( PCLZIP_ATT_FILE_NAME => $orgFile,
       PCLZIP_ATT_FILE_NEW_FULL_NAME => "{$someNewName}"
    );

foreach ($aList as $key => $value) {


    $filePathTmp = "{$SomePath}.pdf";

    if(!file_exists($filePathTmp)) {
        continue;
    }
    //$filePath[] = "{$SomePath}.pdf";

    $filePath[] = array( PCLZIP_ATT_FILE_NAME => $filePathTmp,
       PCLZIP_ATT_FILE_NEW_FULL_NAME => "PDFs/Version-{$sVersion}.pdf"
    );
}

$v_list = $archive->add($filePath, PCLZIP_OPT_REMOVE_PATH, 'PDFs');
if ($v_list == 0) {
    die("Cannot Create Archive! Try again or contact administrator");
    die("Error : ".$archive->errorInfo(true));
}

header("Content-Type: application/zip");
header("Content-Disposition:attachment;filename=\"{$SOMENAME}.zip\"");

readfile("exportZIPs/{$randomFileName}.zip");

@unlink("exportZIPs/{$randomFileName}.zip");

?>

我做错了什么?

1 个答案:

答案 0 :(得分:0)

最后我发现,问题不在于创建存档。发送内容数据时出现问题。

我在代码中添加了以下行,并修复了它:

header("Content-Type: application/octet-stream");

header("Content-Disposition:attachment;filename=\"{$document->iID}-{$document->sName}.zip\"");
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
$originalFile = "exportZIPs/{$randomFileName}.zip";
header('Content-Length: ' . filesize($originalFile));
ob_clean();
flush();
readfile("exportZIPs/{$randomFileName}.zip");

@unlink("exportZIPs/{$randomFileName}.zip");

认识到这一点太长时间的原因是winZIP和其他ZIP应用程序是自动修正问题,并且没有报告存档被破坏。