【发布时间】:2016-08-26 04:08:56
【问题描述】:
我有一个脚本,它生成一个通过 ajax 下载的文件。我需要控制这个请求,因为不是每个人都应该能够下载文件。流程如下:
- 监听点击事件,向服务器发送带有数据的ajax请求
- 处理请求,如果一切正常,将生成一个临时文件,第一行作为文件名,进一步的内容是要下载的文件的内容
- 将新生成文件的 URL 发送回 ajax 函数,并使用该端点填充隐藏的 iframe 的 src 属性。
- 调用端点时,控制器方法会检查文件是否存在,打开它并使用
array_shift将第一行放入$filename变量中,并将其余内容放入$content变量中, - 设置下载标头并回显
$content变量。
不知何故,这并没有按预期工作。这不是因为 iframe,因为当我在浏览器中访问 URL 时,Chrome 告诉我出现 ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION 错误。我正在使用 Laravel,但我没有看到我在哪里设置了错误的标题?
目前的下载脚本:
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 和$content 的值会显示预期值。
建议?谢谢。
【问题讨论】:
-
是的,标题似乎有错误。没有完成你的逻辑,但这里有一个链接可以帮助你stackoverflow.com/questions/386845/… 同样在同一点上,最好将 document.location 设置为链接,文件将被下载而不是重定向到下载链接。
-
感谢您的回复,太糟糕了,将内容类型更改为 application/octet-stream 没有帮助。
标签: php