Zend framework2 使用ZF2强制下载

Zend framework2 使用ZF2强制下载,zend-framework2,force-download,Zend Framework2,Force Download,我正在尝试使用ZF2进行强制下载。下面是我的代码片段 use Zend\Http\Request; ..... public function downloadAction() { $response = new Request(); $response->setHeaders(Request::fromString("Content-Type: application/octet-stream\r\nContent-Length: 9\r\nContent-D

我正在尝试使用ZF2进行强制下载。下面是我的代码片段

 use Zend\Http\Request;
 .....
   public function downloadAction() {
     $response = new Request();
    $response->setHeaders(Request::fromString("Content-Type: application/octet-stream\r\nContent-Length: 9\r\nContent-Disposition: attachment; filename=\"ultimate_remedy_readme.txt\""));


}
现在我得到了这个错误

/var/www/whowantsmymoney/vendor/zendframework/zendframework/library/Zend/Http/Request.php:88
信息:

A valid request line was not found in the provided string
堆栈跟踪:

#0 /var/www/whowantsmymoney/module/Admin/src/Admin/Controller/LanguageController.php(93): Zend\Http\Request::fromString('Content-Type: a...')

这段代码应该可以帮助您下载一个简单的文件

公共函数下载操作(){
$fileName='somefile';
如果(!is_文件($fileName)){
//做点什么
}
$fileContents=file\u get\u contents($fileName);
$response=$this->getResponse();
$response->setContent($fileContents);
$headers=$response->getHeaders();
$headers->clearHeaders()
->addHeaderLine('Content-Type','无论您的内容类型是什么')
->addHeaderLine('Content-Disposition','attachment;filename=“.$filename.”)
->addHeaderLine('Content-Length',strlen($fileContents));
返回$this->response;
}
我想这段代码还有很多需要改进的地方,但应该可以在简单的情况下工作,就像我的代码一样。我不确定您如何处理分块读取文件的问题。也许其他人可以透露一些信息

编辑-发送流

我在这里添加这个是为了提供信息。这可能是强制下载的更好方法,因为它将使用更少的内存

公共函数下载操作(){
$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','无论您的内容类型是什么')
->addHeaderLine('Content-Disposition','attachment;filename=“.$filename.”)
->addHeaderLine('Content-Length',filesize($fileName));
$response->setHeaders($headers);
返回$response;

感谢@Aydin Hassan的回复,但他的回答中缺少几个重要的标题。请小心

完整标题堆栈:

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;
}

您不应该实例化新的请求对象,而应该获取现有的响应。请尝试$this->getResponse()唯一的原因是,我不使用现有的标题是,现有的标题没有内容,我希望,所以我必须创造新的。同意。但你应该考虑的事实,这个问题是问大约2年前,并根据当时的需要和成熟度。ZF2在当时,这个问题及其答案解决了很多基本问题problems@noobie-php我向您保证,HTTP规范在这两年内不会改变。我努力改进社区内容,并添加了一些标题。这将阻止最终缓存下载内容,这取决于浏览器的实现。谢谢在第一种情况下,您返回
return$this->response;
在另一个
return$response;
是打字错误还是正确?