3

在我的网页中,我有一个用于下载文件的按钮。如果没有要下载的文件,那么我想在同一页面上显示一条消息。当有文件要下载时,以下 javascript 代码有效(id 是文件 id):

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
        }
    });
}

所以,我的问题是:

  1. 如何实现上述功能?
  2. 具体来说,如果响应中有附件文件,是否可以将响应传递给浏览器,以便浏览器处理文件下载?

更新:我现在可以处理“无文件”的情况:

$.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);
    }
});

因此,我的第二个问题“如何将原始响应传递给浏览器”尚未得到解答。

4

2 回答 2

1

有源代码的现成插件:jquery.fileDownload.js 库

于 2013-08-14T04:17:28.317 回答
0

当依赖标准浏览器的可能性时,您不能使用 ajax 进行文件下载。我认为最好的解决方案是使用隐藏的 iframe。
在页面启动时创建iframe空内容和空src. 然后,当您要下载文件时,只需src使用文件 url 更新 iframe。在您需要loadiframe. 处理程序应检查 iframe 内容(例如正文)是否有错误消息。如果是这样 - 您可以显示自定义消息。
您无法处理成功(afaik),因为浏览器会自动处理它并显示“另存为”对话框。

笔记:

  • 要获得 iframe 正文,请使用:$('#frame').contents().find('body').
  • load触发事件时取决于浏览器iframe- 在加载主页后也准备好处理它(空/初始iframe状态)

我认为,您也可以考虑使用不同的检查请求和下载附件。用请求检查它POST并在服务器端检查是否可以找到附件。如果是,则响应 OK 状态,然后GET在客户端使用请求来检索附件。在这种情况下,通常window.open足以下载文件。浏览器GET自己发送请求并处理下载。

注意:
请记住发送带有附件内容响应的标头,如下所示:
"Content-Disposition", "attachment; filename=yourFileName"

于 2013-08-14T05:25:33.483 回答