【问题标题】:Ajax - Knowing if file download was correctly sent from serverAjax - 知道文件下载是否从服务器正确发送
【发布时间】:2014-08-25 23:48:24
【问题描述】:

我有一个 extjs ajax 函数,它向服务器发送一个表单,该表单返回一个文件以下载正确的 Content-Disposition ="attachment; filename='test.zip'" 标头。可以使用浏览器的正常文件下载窗口下载文件。但是ajax请求的成功回调函数没有被触发,ajax无限等待响应。

有没有办法告诉 ajax 函数文件是否从服务器正确发送?

  exportLayer = function(node_id){
    Ext.Ajax.request({
      method: "GET",
      form: "exportForm",
      url: "/basqui/layer/shapefile/export/" + node_id + "/",
      success: function(r){
                  html = Ext.decode(r.responseText).html
                  Ext.get('pageContent').update(html);
                  },
    });
  }

【问题讨论】:

  • 如果你只是返回网址本身,你可以简单地做window.location='path/to/download'
  • 它是一个内存文件,一个使用数据库数据创建的 zip,而不是服务器磁盘上的文件
  • 所以跳过 ajax 直接使用 window.location
  • ajax用于提交创建文件所需的表单
  • 为什么不能直接获取值并将它们添加到 GET 中? ajax 不适用于文件下载。或者只是提交表单,如果它是服务器端的 zipp 输出,浏览器将不会重定向

标签: javascript ajax extjs


【解决方案1】:

设置Ext.Ajax.requestbinary 配置属性,在响应中你会得到 responseBytes 属性中的二进制数据。

例如加载jpeg图片:

Ext.Ajax.request({
      url: "/path/to/image/test.jpg",
      success: function(xhr) {
          var b64encoded = btoa(String.fromCharCode.apply(null, xhr.responseBytes));

          var img = Ext.create('Ext.Img', {
              src: 'data:application/jpeg;base64,' + b64encoded
          });
          // add image somewhere
          ...                
      }
 });

【讨论】:

  • 不确定大文件是否有效,如何将其发送到浏览器的下载应用程序?
  • 返回带有验证结果的 json 和经过 base64 编码的文件数据库对于大文件来说效率低下,但对于小文件来说是有效的。如何下载通过xhr、FileAPI 和 XHR2 接收到的二进制数据。但是,如果您想验证表单,然后在没有 FileAPI&XHR2 的情况下下载文件,请分两步完成:1. xhr 验证表单和 2. 接收验证结果并确保 xhr 响应中的所有内容都正确运行window.location dedicated文件下载。
  • 我的回答主要是关于为什么您的Ext.Ajax.request 没有被触发并且ajax 无限期地等待响应。 原因是请求接收二进制数据但@ 987654328@ 配置选项丢失。
猜你喜欢
  • 2020-02-12
  • 1970-01-01
  • 2016-04-30
  • 2011-11-19
  • 2021-05-13
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多