通过 Ajax 和 PHP 强制下载
我想创建一个允许强制下载 JPG 的下载脚本.这是我的 php 脚本:
i want to create a downloadscript which allows Force Download of JPGs. This is my php script:
<?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代码的一段代码:
This is a code segment of my js code:
function downloadFile(a){
document.location = "download.php?a="+ a;
}
使用此代码示例没有任何反应.如果我将结果附加到 HTML 标签中,它会显示文件的内容.
With this code sample nothing happens. If i append the result into a HTML-tag, it shows the content of the file.
任何想法如何教浏览器下载此文件?
Any ideas how to teach the browser to download this file?
脚本更新
推荐答案
您无法使用 ajax 下载文件.所以,如果你有一些应该在 ajax 上发生的事情,你应该返回 url 作为响应并像 document.location = "url"
一样应用它来开始下载过程.
You can't download files with ajax. So, if you have something that should happen on ajax, you should return url in response and apply it like document.location = "url"
to start download process.
这里有一个注意事项.我记得,如果不是由用户点击启动,浏览器将阻止文件下载.所以,这会正常工作:
One note here. As I remember, browser will block file download if it is initiated not by user click. So, this will work fine:
.click(function(){
document.location = "download url"
})
但是如果不是通过用户点击启动的,它会被阻止.所以,代码如下:
But if it is started not by user click, it will be blocked. So, code like this:
.click(function(){
$.ajax({...,
success:function(download_url_from_server){
document.location = download_url_from_server;
}});
})
会被浏览器拦截.因此,如果您想通过帖子传递一些数据,您可以使用 <form target="..."
将表单提交到隐藏的 iframe 或空白页面:
will be blocked by browser. So, if you want to pass some data with a post, you may submit a form into hidden iframe or to blank page using <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 的代码,如果令牌没问题,或者做一个重定向来下载脚本:
And in script.php you need to execute code from download.php immediately, if token is Ok, or do a redirect to download script:
header("Location: download.php?a=" . $filename)
相关文章