Zend Framework 2文件下载

Dan*_*ord 4 php download zend-framework2

我制作了一个表单,./data/uploads使用Zend\Filter\File\RenameUpload过滤器将文件上传到文件夹.

这就像一个魅力.我现在的问题是如何将这个文件提供给用户下载呢?

我想它会是这样的:

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

但我想知道最好的方法是什么.

hus*_*elt 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;
}
Run Code Online (Sandbox Code Playgroud)

在这里找到: 使用zf2强制下载

这里有更多细节: 使用zend发送流响应


Ath*_*lan 11

感谢@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;
}
Run Code Online (Sandbox Code Playgroud)