【发布时间】:2020-07-15 23:34:49
【问题描述】:
我有一个带有 URL 路由的 Flask Web 应用程序,它接收带有一些 json 的发布请求,将其解析为 .xlsx 文件,然后返回带有 send_file() 的文件。
服务器端,我可以看到生成的 .xlsx 文件是正确的,但在客户端下载后,该文件已损坏且无法打开,并且比预期的要大得多(201KB 对 112KB) .
我怀疑这是某种编码问题,但我尝试了一大堆东西,但无法取得任何进展。有人可以帮忙吗?
烧瓶路线:
@app.route('/request/export_XLSX',methods=['POST'])
def request_export_XLSX():
json_model = json_util.loads(request.data.decode('ascii', 'ignore'))
xlsx_model = detox.xlsxFromJSONModel(json_model) # Returns file path
result = send_file(xlsx_model, as_attachment=True, attachment_filename=json_model['id']+'.xlsx', mimetype='application/vnd.ms-excel')
return result
JavaScript:
var exportModelExcel = function(){
var model = detox.fba.model
d3.selectAll('*').style("cursor","wait")
var modelJson = JSON.stringify(model)
$.ajax({
type: "POST",
url: "/request/export_XLSX",
data: modelJson,
success: function(d){
d3.selectAll('*').style("cursor","")
var blob = new Blob([d], {type: 'application/vnd.ms-excel'})
var link=document.createElement("a");
link.href=window.URL.createObjectURL(blob);
link.download=model.id+".xlsx";
link.click();
},
error: function(jqxhr,textStatus,errorThrown){
console.log("Error: " ,textStatus,errorThrown)
d3.selectAll('*').style("cursor","")
alert("There was an error exporting the model")
},
contentType: 'application/json',
responseType: 'blob',
processData: false,
});
}
这是一个链接,您可以在其中查看好的和坏的 .xlsx 文件:https://gofile.io/d/xywI1D
【问题讨论】:
-
我怀疑这是 Flask 端的编码问题,因为它将是二进制文件。我想知道如果您只是将浏览器发送到文件 URL 而不是使用客户端技巧下载文件会发生什么。那它看起来有什么不同吗?
-
另外出于安全原因,我没有打开你的文件(我相信你明白),但我确实尝试使用 Unix 文件命令检查文件。它将 _bad 文件报告为 Zip 存档数据,而将好文件报告为 Microsoft Excel 文件。这可能会有所启发,但我不确定是什么?
-
在坏文件中,每个非 ascii 字节都被替换为 EFBFBD,即 unicode 替换字符。 xlsx 文件是 xml 压缩文件,并且有足够的 zip 标头存活以欺骗
file- 但如果不查看内容,它就无法判断它是 xlsx。 -
尝试将标头 Content-Transfer-Encoding: base64 添加到您的请求中,如stackoverflow.com/questions/8318314/…中所建议的那样
标签: javascript python ajax flask