PCLZIP создает почтовый индекс, который блокируется Gmail, потому что ложно интерпретируется как почтовый индекс, содержащий исполняемый файл
Я использую PCLZIP для создания ZIP, который содержит несколько документов и PDF-файлов. На некоторых компьютерах пользователи утверждают, что zip поврежден.
На моих машинах я не вижу, чтобы ZIP был поврежден, но всякий раз, когда я пытаюсь отправить этот zip через Gmail, он блокирует ZIP, говоря, что он содержит исполняемый файл, но на самом деле все, что есть в zip - это документы и файлы PDF. Поэтому я вижу связь между людьми, утверждающими, что zip поврежден, и Gmail, блокирующими эти zip, созданные в нашем приложении.
Я попытался извлечь все файлы и снова добавить их в zip, используя опцию добавления в архив Windows. И если я отправлю этот zip, gmail не заблокируется.
Поэтому я считаю, что при создании ZIP в моем приложении PHP должна быть какая-то проблема.
Вот соответствующая часть кода, где я создаю 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 ответ
Наконец я узнал, что проблема не в создании архива. Проблема была при отправке данных контента.
Я добавил следующие строки в код, и он исправил это:
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 имели проблемы с автозаменой и не сообщали о повреждении архива.