2013-04-18 3 views
4

Я сделал форму для загрузки файлов в папку ./data/uploads с использованием фильтра Zend\Filter\File\RenameUpload.Zend Framework 2 file загрузить

Это работает как шарм. Моя проблема теперь в том, как я могу предоставить этот файл пользователям для загрузки?

Я думаю, что это будет что-то вроде:

$response->setContent(file_get_contents('./data/uploads/file.png'));

Но я хочу знать, что это лучший способ сделать это.

+1

возможно дубликат [сила скачать с помощью ZF2] (http://stackoverflow.com/questions/15219873/force-download-using-zf2) – Makoto

ответ

9

Благодаря @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; 
} 
14

Для тех, кто сталкивается с этой нитью, ищет ответ, это решение, которое работает, и оно использует потоки!

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 download using zf2

Подробнее здесь: sending stream responses with zend