Я сделал форму для загрузки файлов в папку ./data/uploads
с использованием Zend\Filter\File\RenameUpload
.
Это работает как шарм. Моя проблема теперь в том, как я могу предоставить этот файл пользователям для загрузки?
Я думаю, что это будет что-то вроде:
$response->setContent(file_get_contents('./data/uploads/file.png'));
Но я хочу знать, что это лучший способ сделать это.
Благодаря @henrik для ответа, но в его ответе отсутствуют несколько важных заголовков. Будьте осторожны.
Полный стек заголовков:
public function downloadAction() { $file = 'path/to/file'; $response = new \Zend\Http\Response\Stream(); $response->setStream(fopen($file, 'r')); $response->setStatusCode(200); $response->setStreamName(basename($file)); $headers = new \Zend\Http\Headers(); $headers->addHeaders(array( 'Content-Disposition' => 'attachment; filename="' . basename($file) .'"', 'Content-Type' => 'application/octet-stream', 'Content-Length' => filesize($file), 'Expires' => '@0', // @0, because zf2 parses date as string to \DateTime() object 'Cache-Control' => 'must-revalidate', 'Pragma' => 'public' )); $response->setHeaders($headers); return $response; }
Для тех, кто сталкивается с этой нитью, ищет ответ, это решение, которое работает, и оно использует потоки!
public function downloadAction() { $fileName = 'somefile'; $response = new \Zend\Http\Response\Stream(); $response->setStream(fopen($fileName, 'r')); $response->setStatusCode(200); $headers = new \Zend\Http\Headers(); $headers->addHeaderLine('Content-Type', 'whatever your content type is') ->addHeaderLine('Content-Disposition', 'attachment; filename="' . $fileName . '"') ->addHeaderLine('Content-Length', filesize($fileName)); $response->setHeaders($headers); return $response; }
Найдено здесь: force загрузить с помощью zf2
Подробнее здесь: отправка потоковых ответов с помощью zend