Flask web app和ajax POST请求中的.xlsx文件已损坏

2024-04-20 05:54:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有URL路由的Flask web应用程序,它接收带有一些json的post请求,将其解析为一个.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


Tags: 文件jsonmodelapplicationstylerequestvarlink
1条回答
网友
1楼 · 发布于 2024-04-20 05:54:12

好吧,我最终删除了ajax并使用了XMLHTTPRequest

它工作得很好,并生成一个未损坏的.xlsx文件。🙂

var exportModelExcel = function(){
        var model = detox.fba.model;
        var modelJson = JSON.stringify(model);
        var xhttp = new XMLHttpRequest();

        xhttp.onreadystatechange = function() {
                if (this.readyState == 4 && this.status == 200) {
                        var downloadUrl = URL.createObjectURL(xhttp.response);
                        var a = document.createElement("a");
                        document.body.appendChild(a);
                        a.style = "display: none";
                        a.href = downloadUrl;
                        a.download = model.id+".xlsx";
                        a.click();
                }
        };
        xhttp.open("POST", "/request/export_XLSX", true);
        xhttp.setRequestHeader("Content-Type", "application/json");
        xhttp.responseType = "blob";
        xhttp.send(modelJson);
}

相关问题 更多 >