在我的网页中,我有一个用于下载文件的按钮。如果没有要下载的文件,那么我想在同一页面上显示一条消息。当有要下载的文件(id是文件ID)时,以下javascript代码有效:
function downloadFile(id) {
window.location = '/myapp.com/download_file/' + id;
}
我的服务器将文件内容写入响应正文,并将“Content-Disposition”标题设置为“附件”。
现在,当没有文件时,我想返回一些文字,说没有文件可供下载。所以我想做类似下面的事情:
function downloadFile(id) {
$.ajax({
url: '/myapp.com/download_file/' + id,
success: function () {
//if (attachemnt) {
// download file: just pass response to the browser?
//} else {
// show error text
//}
},
error: function () {
//show error message
}
});
}
所以,我的问题是:
更新: 我现在可以处理'无档案'案件:
$.ajax({
url: '{{ path('download_prev_other_data', {'other_data_id':form.vars.value.getOtherDataId() }) }}',
success: function (data, textStatus, jqXHR) {
var header = jqXHR.getResponseHeader('Content-Disposition');
if (header && header.indexOf('attachment') === 0) {
//pass the original response to the browser
} else {
alert(data); //data is just text in my case explaining there was no file
}
},
error: function (jqXHR, textStatus, errorThrown) {
alert(errorThrown);
}
});
所以,我的第二个问题,“如何将原始回复传递给浏览器”尚未得到解答。
答案 0 :(得分:1)
有源代码的现成插件:jquery.fileDownload.js Library
答案 1 :(得分:0)
当依赖标准浏览器可能时,您无法使用ajax进行文件下载。我认为最好的解决方案是使用隐藏的iframe
在页面启动时使用空内容创建iframe
并清空src
。然后当你想下载文件时,只需用文件url更新iframe的src
。在您需要为load
准备iframe
事件处理程序之前。处理程序应检查iframe内容(例如正文)是否有错误消息。如果是这样 - 您可以显示自定义消息
您无法处理成功(afaik)因为浏览器会自动处理它并显示“另存为”对话框。
注意:
$('#frame').contents().find('body')
。load
事件触发iframe
时,它依赖于浏览器 - 在主页加载后也准备好处理它(空/初始iframe
状态)我认为,你也可以考虑使用不同的检查请求。下载附件。使用POST
请求进行检查,并在服务器端检查是否可以找到附件。如果是,则响应OK状态,然后在客户端使用GET
请求来检索附件。在这种情况下,通常window.open
足以下载文件。浏览器本身发送GET
请求并处理下载。
注意:
请记住发送带附件内容回复的标题,如下所示:
"Content-Disposition", "attachment; filename=yourFileName"