2013-04-18 80 views
4

我做了一个表格,使用Zend\Filter\File\RenameUpload过滤器将文件上传到文件夹./data/uploadsZend Framework 2文件下载

这工作就像一个魅力。我现在的问题是如何提供这个文件给用户下载它?

我认为这将是这样的:

$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