Django: загрузка двоичного файла при нажатии кнопки возвращает неправильные данные - PullRequest
1 голос
/ 09 февраля 2020

Реализована загрузка файла при нажатии кнопки для двоичного файла с использованием 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);
           }

выпуск

Файл, загружаемый (2 КБ) при нажатии кнопки, имеет больший размер, чем который изначально находится на сервере (1,4 КБ), а на вкладке «Сеть» в DEV Tools Header : Content-Length правильно установлено значение 1,4 КБ

...