处理jquery.ajax中的附件文件

时间:2013-08-14 04:09:12

标签: jquery ajax download

在我的网页中,我有一个用于下载文件的按钮。如果没有要下载的文件,那么我想在同一页面上显示一条消息。当有要下载的文件(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
        }
    });
}

所以,我的问题是:

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

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

    所以,我的第二个问题,“如何将原始回复传递给浏览器”尚未得到解答。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

注意:

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

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

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