首页 > 解决方案 > Django:按钮单击时的二进制文件下载返回不正确的数据

问题描述

使用 Ajax 和 Django 为二进制文件单击按钮实现文件下载,如下所示

Django 代码

   def generate(self,parms):
      #pdb.set_trace()
      json_data = json.loads(parms.body.decode('utf-8'))
      d_fldr =  BASE_DIR+'/tmp/'+json_data['sessn']+'/'
      resp = None

      try:
        data = None
        with open(d_fldr + json_data['fn'],'rb') as f:
          data = f.read()
        resp = HttpResponse(data,'application/octet-stream')
        resp['Content-Disposition'] = 'attachment;filename=%s'%(json_data['fn'])
      except:
        resp = None
      return resp

按钮单击时的 AJAX 调用

            function ajax_file_send(req,onSucc,onFail) {
               req['beforeSend'] = function() {
                     $('#loading').modal({backdrop: "static"});
                   }
               req['complete'] = function(){
                     $('#loading').modal('hide')
                   }
               req['error'] = onFail;

               req['success'] = onSucc;
               $.ajax( req );
            }
  ....
  .....

        $('#btn_gen').on('click',function(e) {
           console.log("Generate clicked");
           json = { 'sessn' : global_sessn,
                    'fn' : $('#kdb_sel').val(),
                    'xml' : $('#kdb_xml').val()
                  };
           var req = {
               url: "ajx_generate",
               method: "post",
               processData: false,
               contentType: false,
               headers: { "X-CSRFToken": '{{ csrf_token }}'
                        },
               data: JSON.stringify(json),
               //responseType: 'arraybuffer',
           };

           ajax_file_send(req,fun_succ1,fun_fail1);


           function fun_succ1(response) { // on success..
              console.log("fun_succ1 success");
              var binaryData = []; binaryData.push(response);
              var a = document.createElement('a');
              var url = (window.URL || window.webkitURL).createObjectURL(new Blob(binaryData, {type: "application/kdb"}));
              a.href = url;
              a.download = $('#kdb_sel').val();
              document.body.append(a);
              a.click();
              a.remove();
              window.URL.revokeObjectURL(url);
           }

问题

单击按钮时下载的文件 (2KB) 比服务器上最初的文件 (1.4Kb) 更大,而在 DEV Tools 中的网络选项卡Header : Content-Length上正确设置为 1.4Kb

标签: djangoajaxdownloadbinaryfiles

解决方案


推荐阅读