我想创建一个允许强制下载JPG的下载脚本。这是我的PHP脚本:
<?php header("Pragma: public"); // required header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Content-Description: File Transfer"); header("Content-Type: image/jpg"); header('Content-Disposition: attachment; filename="'.basename($GET['a']).'"'); header("Content-Transfer-Encoding: binary"); header("Content-Length: ".filesize(($GET['a'])); readfile(($GET['a']); ?>
这是我的js代码的代码段:
function downloadFile(a){ document.location = "download.php?a="+ a; }
使用此代码示例,什么都不会发生。如果我将结果附加到HTML标记中,它将显示文件的内容。
有什么想法可以教浏览器下载此文件吗?
编辑:脚本更新
您无法使用Ajax下载文件。因此,如果您在ajax上发生了某些情况,则应返回url作为响应,并像document.location = "url"开始下载过程一样应用它。
document.location = "url"
这里有一个音符。我记得,如果不是用户单击启动浏览器,浏览器将阻止文件下载。因此,这将正常工作:
.click(function(){ document.location = "download url" })
但是,如果不是通过用户单击启动它,它将被阻止。因此,这样的代码:
.click(function(){ $.ajax({..., success:function(download_url_from_server){ document.location = download_url_from_server; }}); })
将被浏览器阻止。因此,如果您想在发布时传递一些数据,可以使用以下方法将表单提交到隐藏的iframe或空白页中<form target="...":
<form target="..."
function checkToken(token){ var $form = $("#downloadForm"); if ($form.length == 0) { $form = $("<form>").attr({ "target": "_blank", "id": "downloadForm", "method": "POST", "action": "script.php" }).hide(); $("body").append($form); } $form.find("input").remove(); var args = { a: "checkToken", b: token } for (var field in args) { $form.append($("<input>").attr({"value":args[field], "name":field})); } $form.submit(); }
在script.php中,如果令牌正常,您需要立即从download.php执行代码,或者重定向到下载脚本:
header("Location: download.php?a=" . $filename)