无法将文件发送给浏览器/用户

时间:2016-03-24 10:50:52

标签: php file header

我正在尝试向用户发送zip文件。

$file_info = get_file_info($filepath_name);
header("Content-Type: " . get_mime_by_extension($filepath_name));
header("Content-Length: " . $file_info["size"]);
header_remove('Pragma');
header_remove('Cache-Control');
//header("Content-Type: application/force-download");
header('Content-Type: application/octet-stream');        
header('Content-Disposition: attachment; filename='.urlencode($filepath_name));
header('Location: file://'.$filepath_name);
readfile($filepath_name);

$filepath_name设置为“D:\ dev2.local \ storage_users \ 1 \ export_data \ course_2357.zip”。

readfile()会返回正确的文件大小,但文件仍然无法下载。

我已尝试过所有标头设置的组合无效。

4 个答案:

答案 0 :(得分:3)

header('Location: file://'.$filepath_name);看起来有问题。这是header函数的一种特殊用法,它向浏览器发送302重定向HTTP状态,重定向到指定的URL。

这里没有添加任何内容,我会删除它。

ZIP存档的正确MIME类型为application/zip而不是application/octet-stream。发送正确的标题会使浏览器更有可能在正确的程序中打开文件。

URL编码文件的完整路径会产生长度为69个字符的文件名。我认为这不太可能导致问题,但我们也可以通过发送基本名称“course_2357.zip”来简化它。我认为根本不需要对文件名进行URL编码 - 这似乎源于一个Internet Explorer 8 hack来获得UTF-8字符,这在你的情况下是不需要的 - 但我把它留在了原地它没有造成任何伤害。

我使用过PHP的内置filesize而不是get_file_info,因为我没有安装CodeIgniter。我假设这是函数的来源?

以下基于您上面提供的内容的代码对我有用:

header("Content-Length: " . filesize($filepath_name));
header_remove('Pragma');
header_remove('Cache-Control');
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename='.urlencode(basename($filepath_name)));
readfile($filepath_name);

答案 1 :(得分:0)

看起来您的标题存在问题。

您可以尝试这样的事情:

ob_start();
//OR
ob_clean();
header("Content-Type: " . get_mime_by_extension($filepath_name));
/* Other code */

答案 2 :(得分:0)

我不知道这是您输入的顺序,但是:您是否尝试过:

$filepath_name =  "D:\\dev2.local\\storage_users\\1\\export_data\\course_2357.zip"

位于代码顶部,或至少在readfile()

之前

等待您的更新。

答案 3 :(得分:0)

发现问题:

这个功能是通过AJAX调用调用的,这就是为什么php不允许发送文件。

发现解决方案: 不得不返回文件路径并将其命名为js,其中php是ajaxed并从js提供文件。

编辑: 这是我使用的解决方法:

                                var hostname = window.location.protocol + "//" + window.location.hostname + (window.location.port ? ':' + window.location.port: '');

                            jQuery('<iframe>', {
                               src: hostname + value.return_zip,
                               id:  'iFrame_zip_download',
                               frameborder: 0,
                               scrolling: 'no'
                           }).appendTo('#export_import_status');

其中value.return_zip是服务器上文件的相对路径(/storage_users/xx/xx/xx.zip)。然后我添加主机名,结果很好,例如:https://www.google.com/storage_users/xx/xx/xx.zip。 iFrame隐藏在状态div中。