我有一个脚本可以生成一个文件,可以通过ajax下载。我需要控制此请求,因为不是每个人都应该能够下载文件。这个过程如下:
$filename
将第一行放入array_shift
变量,并将其余内容放入{{ 1}}变量,$content
变量。不知怎的,这不能按预期工作。这不是因为iframe,因为当我在浏览器中访问该网址时Chrome会告诉我$content
错误。我正在使用Laravel而且我没有看到我在哪里设置了错误的标题?
到目前为止的下载脚本:
ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION
转储public function download($fileId)
{
$file = $this->tempFilesPath . $fileId;
if (file_exists($file)) {
$data = explode("\n", file_get_contents($file));
//@unlink($file);
$fileName = array_shift($data);
$content = implode("\n", $data);
header('Content-Type: application/force-download');
header('Content-Disposition: attachment; filename=' . $fileName);
echo $content;
exit;
}
}
和$fileName
的值会显示预期值。
连连呢?感谢。
答案 0 :(得分:3)
经过一些额外的挖掘I found a post that writes about this specific error。这是因为我用日期格式化了文件名,其中包含一个令Chrome感到不安的逗号。更改了文件名约定,现在可以正常工作了。如果其他人可能会在以后遇到这种情况,我会在网上留下这个问题。
对于未来的解决方案寻求者:
我首先将文件命名为httprouter
,但日期格式中的逗号是导致问题的原因。把它拿出来,你应该更进一步解决你的问题。
答案 1 :(得分:1)
您可以像这样修改下载方法:
public function download($fileId) {
$file = $this->tempFilesPath . $fileId;
if (file_exists($file)) {
//$data = explode("\n", file_get_contents($file));
//@unlink($file);
//$content = implode("\n", $data);
//$fileName = array_shift($data);
$size = @filesize($file);
//ADD THESE FEW LINES
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
//header('Content-Type: application/force-download');
header('Content-Disposition: attachment; filename=' . $fileId);
header('Content-Transfer-Encoding: binary');
//header('Content-Length: ' . $size);
readfile($file);
return TRUE;
}
}