gpt4 book ai didi

php - readfile() 函数读取 zip 文件而不是下载它 (Zend)

转载 作者:可可西里 更新时间:2023-11-01 12:39:58 27 4
gpt4 key购买 nike

我必须触发一个 zip 文件的下载(Zip 文件在我的数据文件夹中)。为此,我正在使用代码,

$file = 'D:\php7\htdocs\Project\trunk\api\data\file.zip';
header('Content-Description: File Transfer');
header('Content-type: application/zip');
header('Content-disposition: attachment; filename=' . basename($file) );
readfile($file);`

如我所料,这在核心 php 中工作。但是当我在 Zend 中使用相同的代码打印如下内容时,

PKYsVJ)~�� study.xlsPKYsVJs������+
tutorial-point-Export.xlsPKYsVJn��8��Zabc.xlsP

在内容之间我可以看到 zip 中所有文件的名称。但是它没有被下载。

在我意识到这行不通之后,我开始搜索它并从 stack over flow 中找到了一些解决方案

尝试1:在每一行随机添加不同的头部元素和ob函数

  • header('Content-Transfer-Encoding: binary');
  • header('Expires: 0');
  • header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  • header('Pragma: public');
  • header('Content-Length: ' . $file_size);
  • ob_start();
  • ob_clean();
  • flush();

所有这些都是从不同的堆栈溢出问题和答案中尝试的,并且结果相同

尝试 2: PHP is reading file instead of downloading .这个问题没有任何可接受的答案(他问的是核心 php,但我只对 zend 有同样的问题)。我尝试了所有这些,但没有用。

尝试 3: Changing the .htaccess .之后我认为这是我的 .htaccess 的问题,并找到了更改 .htaccess 文件的答案。

<FilesMatch "\.(?i:zip)$">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>

这也给了我同样的结果。

尝试 4: Using download functions in Zend .我已经尝试了这个问题的答案中的所有 zend 函数。但是即使没有读取文件,也给我一个空输出。

尝试 5: 根据 answer 删除 php 标记前后所有不需要的空格

在 ZF2 框架中是否有任何其他方式来触发下载?

编辑

下面是我的确切功能。这是 GET(API) 函数,

public function getList(){
try{
//here i am getting the zip file name.
$exportFile = $this->getRequest()->getQuery('exportid','');
$file = 'D:\php7\htdocs\Project\trunk\api\data\\' . $exportFile . '.zip';
header('Content-Description: File Transfer');
header('Content-type: application/zip');
header('Content-disposition: attachment; filename=' . basename($file) );
readfile($file);
return new JsonModel(["status"=>"Success"]);
} catch(\Exception $e){
return new JsonModel(["status"=>"Failed"]);
}
}

最佳答案

这里有两个问题:

  • 您的浏览器试图打开文件,而不是下载它。
  • 另外,它没有正确打开文件。

两者都指向一个Content-Type 错误。验证浏览器接收Content-Type是否正确(而不是重写为text/html)。

如果是,将其更改为application/x-download。这在 Internet Explorer 中可能不起作用,它执行一些积极的内容类型嗅探。您可以尝试添加 nosniff指令。

此外,在 readfile 之后(您可能被迫返回文件的内容,而不是 readfile()'ing - 即,return file_get_contents($ filename);),你应该用 return null; 停止所有输出。 ZIP 文件目录位于最后,因此如果您在此处附加 JSON 消息,浏览器可能既不会下载文件也不会正确显示文件。

作为最后的手段,你可以去核,自己做所有的事情。非常不优雅,所有框架都应该提供替代方案,但以防万一......

// Stop *all* buffering
while (ob_get_level()) {
ob_end_clean();
}
// Set headers using PHP functions instead of Response
header('Content-Type: application/x-download');
header('X-Content-Type-Options: nosniff');
header('Content-Length: ' . filesize($filename));
header('Content-Disposition: attachment; filename="whatever.zip"');
die(readfile($filename));

有可能一些创造性的使用 atexit 处理程序或析构函数 Hook 可能会搞砸甚至这最后一个选项,但我觉得这不太可能。

关于php - readfile() 函数读取 zip 文件而不是下载它 (Zend),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42413933/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com