gpt4 book ai didi

php - Symfony 强制下载响应中断文本文件

转载 作者:搜寻专家 更新时间:2023-10-31 22:02:12 25 4
gpt4 key购买 nike

我已经根据这个答案为我的 Symfony 应用程序创建了一个函数:https://stackoverflow.com/a/13025363/1749653

函数是这样的:

public function getForceDownloadResponse($file_path, $file_name){
$file_info = finfo_open(FILEINFO_MIME_TYPE);
$mine_type = finfo_file($file_info, $file_path.$file_name);
finfo_close($file_info);

$response = new Response();
$response->headers->set('Cache-Control', 'private');
$response->headers->set('Content-type', $mine_type);
$response->headers->set('Content-Disposition', 'attachment; filename="' . $file_name . '"');
$response->headers->set('Content-length', filesize($file_path.$file_name));

$response->sendHeaders();
$response->setContent(readfile($file_path.$file_name));

return $response;
}

一切都很顺利……直到有人尝试用它下载一个文本文件。由于某种原因,所有文本文件都以错误的文件名下载。他们都遵循这种模式:Actual_File_Name-,附件所以,例如:new_text.txt-,附件等等

经过一些调查,我只发现了一个文本文件整体上的异常。不知何故,响应 header 字段被复制了。二进制文件将输出如下内容:

Cache-Control:private
Connection:close
Content-Disposition:attachment; filename="Jellyfish.jpg"
Content-Length:775702
Content-Type:image/jpeg
Date:Mon, 10 Nov 2014 09:14:41 GMT
Server:Apache/2.4.7 (Win32) OpenSSL/1.0.1e PHP/5.5.6

任何文本文件都将如下所示:

Cache-Control:private
Cache-Control:private
Connection:Keep-Alive
Content-Disposition:attachment; filename="full.txt"
Content-Disposition:attachment; filename="full.txt"
Content-Length:15
Content-Type:text/plain; charset=UTF-8
Date:Mon, 10 Nov 2014 09:06:00 GMT
Keep-Alive:timeout=5, max=97
Server:Apache/2.4.7 (Win32) OpenSSL/1.0.1e PHP/5.5.6

我怀疑意外行为的根源在于导致内容 header 行为的原因。但我终究无法弄清楚这些是如何发生的。

因此,如果有人知道更多有关如何创建它们、可能导致它们表现如此甚至如何彻底解决问题的信息,我们将不胜感激。

最佳答案

终于明白了。将它张贴在这里以防有人在某个地方遇到类似的问题并发现它有用:

所以。事实证明,有问题的行是这样的:

$response-sendHeaders()

对于二进制文件,这一行对于使其工作至关重要。文本文件不需要它,但实际上会像上面看到的那样中断。我还没有确切地知道它为什么会这样。但解决方案是简单地检查请求的文件是否为文本文件。 (对于 .html 文件有一个内置异常(exception),但这更多是项目的可选功能/怪癖,因此可以安全地忽略)

这是该函数现在的样子,并且运行良好:

public function getForceDownloadResponse($file_path, $file_name){
$file_info = finfo_open(FILEINFO_MIME_TYPE);
$mime_type = finfo_file($file_info, $file_path.$file_name);
$text = (substr(finfo_file($file_info, $file_path.$file_name), 0, 4) == 'text') ? 1 : 0;
finfo_close($file_info);

$response = new Response();
$response->headers->set('Cache-Control', 'private');
$response->headers->set('Content-type', $mime_type);
$response->headers->set('Content-Disposition', 'attachment; filename="' . $file_name . '"');
$response->headers->set('Content-length', filesize($file_path.$file_name));

if(!$text || $mime_type == 'text/html'){
$response->sendHeaders();
}

$response->setContent(readfile($file_path.$file_name));

return $response;
}

因为我仍然不知道究竟是什么导致了不同的行为,它并不像我希望的那样安全可靠,但到目前为止它的工作还不错。

关于php - Symfony 强制下载响应中断文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26840372/

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