web-dev-qa-db-ja.com

Zipファイルを作成してダウンロードする

Local-serverにZipファイルを作成して2つのファイルをダウンロードしようとしています。ファイルはZip形式でダウンロードされますが、抽出しようとするとエラーが発生します。End-of-central-directory signature notこのファイルはZipファイルではないか、マルチパートアーカイブの1つのディスクを構成します。後者の場合、中央ディレクトリとZipファイルのコメントはこのアーカイブの最後のディスクにあります。 =

これに使用している次のコード:

 <?php
$file_names = array('iMUST Operating Manual V1.3a.pdf','iMUST Product Information Sheet.pdf');

//Archive name
$archive_file_name=$name.'iMUST_Products.Zip';

//Download Files path
$file_path=$_SERVER['DOCUMENT_ROOT'].'/Harshal/files/';


zipFilesAndDownload($file_names,$archive_file_name,$file_path);

function zipFilesAndDownload($file_names,$archive_file_name,$file_path)
{
        //echo $file_path;die;
    $Zip = new ZipArchive();
    //create the file and throw the error if unsuccessful
    if ($Zip->open($archive_file_name, ZIPARCHIVE::CREATE )!==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);
        //echo $file_path.$files,$files."

    }
    $Zip->close();
    //then send the headers to force 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;
}




?>

私は関数に渡されるすべての変数の値をチェックしました、すべてが素晴らしいです。これを見てください。

30
Harshal Mahajan

バイト単位でZipファイルのサイズを説明するContent-lengthヘッダーを追加します。

header("Content-type: application/Zip"); 
header("Content-Disposition: attachment; filename=$archive_file_name");
header("Content-length: " . filesize($archive_file_name));
header("Pragma: no-cache"); 
header("Expires: 0"); 
readfile("$archive_file_name");

また、<?の前と?>の後に空白が絶対にないことを確認してください。ここにスペースがあります:

 <?php
$file_names = array('iMUST Operating Manual V1.3a.pdf','iMUST Product Information Sheet.pdf');
37
Kuba Wyrostek
// http headers for Zip downloads
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$filename."\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filepath.$filename));
ob_end_flush();
@readfile($filepath.$filename);

私はこの解決策を見つけました ここ そしてそれは私のために働く

6
vitams
$Zip = new ZipArchive;
$tmp_file = 'assets/myzip.Zip';
    if ($Zip->open($tmp_file,  ZipArchive::CREATE)) {
        $Zip->addFile('folder/bootstrap.js', 'bootstrap.js');
        $Zip->addFile('folder/bootstrap.min.js', 'bootstrap.min.js');
        $Zip->close();
        echo 'Archive created!';
        header('Content-disposition: attachment; filename=files.Zip');
        header('Content-type: application/Zip');
        readfile($tmp_file);
   } else {
       echo 'Failed!';
   }
5
M Arfan

エラーの1つは、ファイルが「アーカイブ」形式として読み取られないことです。 ZipArchiveがファイルを開かない-エラーコード:19 を確認してください。ダウンロードしたファイルをテキストエディターで開きます。開始時にHTMLタグまたはデバッグステートメントがある場合は、ファイルを読み取る前にバッファーをクリアします。

ob_clean();
flush();
readfile("$archive_file_name");
2
Avinav

私はこの問題に出くわしました。私にとって問題は次のとおりでした:

readfile("$archive_file_name");

メモリ不足エラーが発生していました。

Allowed memory size of 134217728 bytes exhausted (tried to allocate 292982784 bytes)

Readfile()を次のものに置き換えることで問題を修正できました。

    $handle = fopen($zipPath, "rb");
    while (!feof($handle)){
        echo fread($handle, 8192);
    }
    fclose($handle);

これがあなたの同じ問題なのか、ファイルが1.2 MBだけだということがわからないのかわかりません。たぶん、これは同様の問題を抱えている他の誰かを助けるでしょう。

2
David Rodriguez

私はまったく同じ問題を経験しました。私の場合、そのソースは、すべて読み取り専用に設定されたZipファイルを作成したいフォルダーのアクセス許可でした。読み取りと書き込みに変更しましたが、動作しました。

スクリプトを実行したときにファイルがローカルサーバー上に作成されていない場合、おそらく私と同じ問題があります。

1
user2752793

しかし、ダウンロード後にサーバーから取得しているファイルのサイズは226バイトです

これは、Zipヘッダーのサイズです。どうやらデータがありませんダウンロードしたZipファイルにあります。それで、Zipファイルに追加するファイルが実際に存在することを確認できますか(ダウンロードのパスPHPスクリプト)に対して)?

addFileにもチェックを追加することを検討してください。

foreach($file_names as $file)
{
    $inputFile = $file_path . $file;
    if (!file_exists($inputFile))
        trigger_error("The input file $inputFile does not exist", E_USER_ERROR);
    if (!is_readable($inputFile))
        trigger_error("The input file $inputFile exists, but has wrong permissions or ownership", E_USER_ERROR);
    if (!$Zip->addFile($inputFile, $file))
        trigger_error("Could not add $inputFile to Zip file", E_USER_ERROR);
}

観察された動作は、いくつかの問題(パスエラー、権限の問題など)と一致しており、ファイルがZipファイルに追加されないようにしています。 「空の」Zipファイルを受信すると、クライアントはZip中央ディレクトリが見つからないことを示すエラーを発行します(実際のエラーは、ディレクトリもファイルも存在しないことです)。

0
LSerni