在我的HTML页面上,我向一个强制下载的php脚本发出了一个JQuery ajax请求,但什么都没发生?
在我的html页面上(在链接的点击事件处理程序中)...
var file = "uploads/test.css";
$.ajax(
{
type : "POST",
url : "utils/Download_File.php",
data : {"file":file}
})
Download_File.php脚本看起来像这样
<?php
Download_File::download();
class Download_File
{
public static function download()
{
$file = $_POST['file'];
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment');
readfile('http://localhost/myapp/' . $file);
exit;
}
}
?>
但是由于某种原因什么都没发生?我查看了firebug中的响应头,无法看到任何问题。我正在使用Xampp。非常感谢任何帮助。
谢谢!
答案 0 :(得分:9)
您应该指定Content-Transfer-Encoding
。另外,您应在filename
上指定Content-Disposition
。
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-Disposition: attachment; filename="'.$file.'"');
readfile('http://localhost/myapp/'.$file);
exit;
filename
包含双引号非常重要,因为RFC 2231需要这样做。如果filename
不在引号中,则知道Firefox在下载文件名中包含空格的文件时会遇到问题。
另外,请检查以确保在结束?>
后没有空格。如果在关闭PHP标记之后存在空格,则标题将不会发送到浏览器。
作为旁注,如果您要提供下载的许多常见文件类型,则可以考虑指定这些MIME类型。这为最终用户提供了更好的体验。例如,你可以这样做:
//Handles the MIME type of common files
$extension = explode('.', $file);
$extension = $extension[count($extension)-1];
SWITCH($extension) {
case 'dmg':
header('Content-Type: application/octet-stream');
break;
case 'exe':
header('Content-Type: application/exe');
break;
case 'pdf':
header('Content-Type: application/pdf');
break;
case 'sit':
header('Content-Type: application/x-stuffit');
break;
case 'zip':
header('Content-Type: application/zip');
break;
default:
header('Content-Type: application/force-download');
break;
}
答案 1 :(得分:3)
好的,我终于可以使用这里找到的JQuery插件来完成这项工作了:
http://www.filamentgroup.com/lab/jquery_plugin_for_requesting_ajax_like_file_downloads/
现在工作正常!
答案 2 :(得分:-1)
使用 document.location.href=URL
,而不是 ajax..
根据我的经验,ajax 会导致问题(下载不起作用,在浏览器控制台上打印文件内容)。