2

私はいくつかの PDF ファイルを持っています...それらを 1 つずつではなく、コレクションとしてダウンロードしたいのです。そのために、すべてのpdfファイルを圧縮してダウンロードしようとしています。しかし、私のコードで ZipArchive ファイル名を変更しているときに、破損していて破損していると言っている理由がわかりません。私のコードは以下の通りです:-

 function zipFilesAndDownload($file_names,$archive_file_name,$file_path)
{
    $zip = new ZipArchive();
    //create the file and throw the error if unsuccessful
    if ($zip->open($archive_file_name, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE )!==TRUE) {
        exit("cannot open <$archive_file_name>\n");
    }
    //add each files of $file_name array to archive
    foreach($file_names as $files)
    {
        $zip->addFile($file_path.$files,$files);

    }
    $zip->close();
    //then send the headers to foce download the zip file
    header("Content-type: application/zip"); 
    header("Content-Disposition: attachment; filename=$archive_file_name"); 
    header("Pragma: no-cache"); 
    header("Expires: 0"); 
    readfile("$archive_file_name"); 
    exit;
}



if($button=="Save as pdf")
{
$file_names = array();
foreach($a as $key=>$as)
{
 $file_names[] = $key.'.pdf';
}
}
$archive_file_name='zipped.zip';
$file_path='/resume/';
zipFilesAndDownload($file_names,$archive_file_name,$file_path);

?>

誰でも私を助けることができますか?前もって感謝します。

正常に動作していますが、まだ 2 つの問題に直面しています。archive_file_name の名前を上記以外の名前に変更すると、アーカイブが破損しているというエラーが発生します。2.たとえば、2つのpdfのzipファイルを取得した場合、以前のものとは異なる1つのpdfのみのzipを再度ダウンロードします。しかし、1 つの pdf の zip をダウンロードしているときに、3 つの pdf を取得しています......理由がわかりません.......助けてください。

4

1 に答える 1

1

私はあなたの機能をテストしましたが、zipFilesAndDownloadうまくいきます。<?phpそのため、最初に、開始タグの前に文字や空白が送信されていないかどうか、スクリプトを確認する必要があります。

スクリプトが CMS 内で実行されている場合は、すべての出力バッファーもクリアする必要がありますwhile (@ob_end_clean());(gzip ヘッダーが既に送信されている場合は、gz 圧縮を再度オンにしますob_start('ob_gzhandler');) 。

また、 $file_path を正しく設定し、すべてのファイルが存在するかどうかを確認することもできます。次に例を示します。

$file_path='resume/';
if (!file_exists($file_path) || !is_dir($file_path)) {
    die("Invalid directory $file_path in ".getcwd());
}
// you can test the existence of your problematic files:
foreach ($file_names as $file) {
    if (!file_exists($file_path.$file)) {
        echo "$file not found.";
    } else {
        echo "$file is ok.";
    }
}
exit;
// end of test
zipFilesAndDownload($file_names,$archive_file_name,$file_path);

Windows では、UTF-16/UTF-8/国際文字エンコーディングにも問題があります。こちらを参照してください: PHP 検出ファイルシステム エンコーディングHow do I use filesystem functions in PHP, using UTF-8 strings? .

于 2012-07-14T18:51:39.750 に答える