#python #excel #ajax #download #buffer
#питон #превосходить #аякс #Скачать #буфер
Вопрос:
Я делаю вызов ajax непосредственно скрипту python и ожидаю в памяти файл excel в качестве ответа.
Аякс:
$.ajax({ url: 'myscript.py', type: 'post', contentType: 'application/json', cache: false, xhr: function () { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (xhr.readyState == 2) { if (xhr.status == 200) { xhr.responseType = 'blob'; } else { xhr.responseType = 'text'; } } }; return xhr; }, data: JSON.stringify( jsonData), processData: false, success: function( response, textStatus, jQxhr ){ var blob = new Blob([response], { type: "data:application/vnd.ms-excel" }); var isIE = false || !!document.documentMode; if (isIE) { window.navigator.msSaveBlob(blob, fileName); } else { var url = window.URL || window.webkitURL; link = url.createObjectURL(blob); var a = $("lt;a /gt;"); a.attr("download", fileName); a.attr("href", link); $("body").append(a); a[0].click(); a.remove(); } }, error: function( jqXhr, textStatus, errorThrown ){ console.log( errorThrown ); } });
Контроллер:
xlsxfile = io.BytesIO() ... print("Content-Type: application/vnd.ms-excelrn") print(xlsxfile.getvalue())
Как и ожидалось, полученный загруженный файл Excel содержит строку байтов, например
b'PKx03x04x14x00x00x00x08x00x00x00?x00a]I:Ox01x00x00x8fx04x00x00x13x00x00x00[Content_Types].xmlxadx94xcbnxc20x10Exf7xfdx8axc8xdb*1tQUx15x81Ex1fxcbx16xa9xf4x03....
Как отправить ответ с python, чтобы ajax правильно обрабатывал тип приложения, а не байтовый литерал, и загрузил соответствующий файл excel? Может ли ajax обрабатывать объект из адреса памяти, например, lt;_io.BytesIO объект в 0x0087C078gt;lt;_io.BytesIO объект в 0x0087C078gt; ?
У меня есть следующие варианты, чтобы разобраться в этом, но я хотел бы знать, возможно ли сделать это так, как я пытаюсь сначала:
- Настройка веб-сервера python (например, flask) для обработки запросов и ответов
- Сначала создайте файл физически на сервере и попросите ajax загрузить файл, используя ссылку на файл
Комментарии:
1. Похоже, это недостижимо. Я решил создать файл на сервере и загрузить его с помощью ajax-маршрута.