【问题标题】:Corrupted .xlsx file from Flask web app and ajax POST request来自 Flask Web 应用程序和 ajax POST 请求的损坏的 .xlsx 文件
【发布时间】: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


【解决方案1】:

好吧,我最终去掉了 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 2013-03-12
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    相关资源
    最近更新 更多