概要
LaraveでWebApp作成時、Zip化する際にZipArchiveというライブラリを使ったのですが、
タイトルのエラーで詰まったので原因・対策を記載してます。
ZipArchiveの使用準備
ZipArichiveを使用する際は、phpでzipを扱うライブラリを取り込んでおく必要があります
私の場合は、以下コマンドでphp-zipをインストールしましたが、他ライブラリもあるみたい
sudo yum install php-zip
Zip化ソース
以下のようにzip化のコーディングを行った
同階層の"compress.zip"に対して、"test.csv"をaddする
流れとしてはopen->addFile->closeといった感じ
zip化したファイルがブラウザから取得できるようレスポンスで返した
// インスタンス
$zip = new ZipArchive();
// zipファイルをオープンする
$zipPath = './compress.zip';
$result = $zip->open($zipPath, ZipArchive::CREATE | ZipArchive::OVERWRITE);
if ($result == true) {
// zipオープン成功時、csvファイルをzipに格納
$compressFile = 'test.csv';
$zip->addFile($compressFile);
$zip->close();
} else {
// エラーレスポンスを返す
return response()->json(['error' => 'File not found.'], 404);
}
// 作成したzipをレスポンスで返す
$headers = [
'Content-Type' => 'application/zip',
'Content-Disposition' => 'attachment'
];
return response()
->download($file, 'test.zip', $headers)
->deleteFileAfterSend(true);
エラー発生
この処理をブラウザで実行した際に以下エラーが出た
ZipArchive::close(): Failure to create temporary file: Permission denied
どうやらファイルを作るのに、パーミッションではじかれてるみたい...
ただ不思議なことにzip化処理をphpファイルに書いてサーバー上で実行した場合はうまくいってる
エラー文で調べるもなかなか解決にいたらず、海外のQAを漁ると以下の文章が目に入る
As the error tells you, this is a permission problem. Make sure the apache user (www-data) has the write permission on the directory where the zip archive is.
apache userが書き込み権限を持ってないディレクトリを扱う際、このエラーがおきるらしい
あー、確かにWebサーバのuser権限とか全然いじってない...
phpでうまくいってたのはそういうわけかとやっと納得
というわけで'test.zip'があるディレクトリの権限を変更した
僕の環境の場合apache userはwww-data
でなく、apache
だった
chown -R apache:apache [path-to-test.zip]
ブラウザからのzip化処理も無事成功
ただしwebユーザしか該当ディレクトリが編集できなくなるので注意
まとめ
ブラウザからのZipArchive処理でPermission deniedが出た場合は、対象のディレクトリが
Webサーバのユーザ権限が付与されてるか確認すること