我正在尝试向用户发送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()
会返回正确的文件大小,但文件仍然无法下载。
我已尝试过所有标头设置的组合无效。
答案 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中。