私はいくつかのファイルをアップロードするアプリケーションを1つ持っており、zipファイルとして圧縮してダウンロードできます。Symfony2 zipファイルを作成してダウンロードします
輸出アクション:
public function exportAction() {
$files = array();
$em = $this->getDoctrine()->getManager();
$doc = $em->getRepository('AdminDocumentBundle:Document')->findAll();
foreach ($_POST as $p) {
foreach ($doc as $d) {
if ($d->getId() == $p) {
array_push($files, "../web/".$d->getWebPath());
}
}
}
$zip = new \ZipArchive();
$zipName = 'Documents-'.time().".zip";
$zip->open($zipName, \ZipArchive::CREATE);
foreach ($files as $f) {
$zip->addFromString(basename($f), file_get_contents($f));
}
$response = new Response();
$response->setContent(readfile("../web/".$zipName));
$response->headers->set('Content-Type', 'application/zip');
$response->header('Content-disposition: attachment; filename=../web/"'.$zipName.'"');
$response->header('Content-Length: ' . filesize("../web/" . $zipName));
$response->readfile("../web/" . $zipName);
return $response;
}
すべてが行ヘッダまでokです。 と私はここに行くつもりです: "警告:readfile(../ web/Documents-1385648213.zip):ストリームを開けませんでした:そのようなファイルやディレクトリはありません"
何が問題なのですか?
ファイルをアップロードすると、このファイルにはroot権限があり、作成したzipファイルでも同じことが起こります。
コントローラが応答を返す必要があります。最後の行は '' 'return new(readfile($ zipName));' 'のようになります。 – jdewit
readfile()は応答に入れることができる文字列を返しません。そのためにストリーミングレスポンスを使用するか、file_get_contentsを使用する必要があります –