4

Laravel 5.2 とZipperを使用して、ZIP アーカイブをその場で作成し、ユーザーがダウンロードします。この問題は一般に、厳密には Laravel や Zipper とは関係がないと思います。手順:

  1. ユーザーがリンクdownload_allをクリックします。
  2. 最初のphpスクリプトはアーカイブを作成します.
  3. 次に、同じスクリプトが作成されたファイルをプッシュして、ユーザーのダウンロードを強制します。

すべてが正常に聞こえますが、zip アーカイブが作成された後 (ポイント 2) php/serverがこの新しく作成されたファイルを表示できないという奇妙な動作があります。$filePath の filesize と file_exists の両方が false を返しますが、ファイルは存在します。ファイルを読み込めないのはなぜですか?

ユーザーを $filePath にリダイレクトすると (読み取ってダウンロードするのではなく)、すべて問題なく、ユーザーはファイルを取得します。しかし、「スクリプトの有効期間」中に新しく作成されたファイルにアクセスできないのはなぜですか? $パスは正しいです。Windows 7 および Unix でテスト済み。

何か案が?

コード:

public function downloadAll($id)
    {
        $sourceFilesDir   = 'upload/source/' . $id;
        $zipPath          = 'upload/source-zip/' . date('Y-m-d-H-i-s') . '.zip';

        Zipper::make($zipPath)->add($sourceFilesDir);

        $fullPath = public_path($zipPath);

        // works
        // return response()->redirectTo($zipPath);

        $headers = [
            'Content-Type: application/zip',
            'Content-Transfer-Encoding: Binary',
            'Content-Length: ' . filesize($fullPath),
        ];

        // dont works, cant see file
        return response()->download($fullPath, basename($zipPath), $headers);
    }
4

1 に答える 1

1

@ホルガーによって解決されました。ファイルを保存するには、ジッパーを閉じる必要があります。

適切なコード:

Zipper::make($zipPath)->add($sourceFilesDir)->close();

->閉じる()

残念ながら、Zipper のドキュメントでは、これについて明確に言及されていません。

于 2016-11-28T14:18:00.927 に答える