提供下载文件不起作用?似乎是标题问题?

时间:2016-05-01 08:39:01

标签: php

我有一个脚本可以生成一个文件,可以通过ajax下载。我需要控制此请求,因为不是每个人都应该能够下载文件。这个过程如下:

  1. 侦听点击事件,将包含数据的ajax请求发送到服务器
  2. 处理请求,如果一切正常,将生成一个临时文件,第一行是文件名,更多内容是要下载的文件的内容
  3. 将新生成的文件的URL发送回ajax函数,并用该端点填充隐藏的iframe的src属性。
  4. 调用端点时,控制器方法会检查文件是否存在,打开它并使用$filename将第一行放入array_shift变量,并将其余内容放入{{ 1}}变量,
  5. 设置下载标题并回显$content变量。
  6. 不知怎的,这不能按预期工作。这不是因为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的值会显示预期值。

    连连呢?感谢。

2 个答案:

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