【问题标题】:Flask send_file as attachment not working烧瓶 send_file 作为附件不起作用
【发布时间】:2013-08-15 23:03:46
【问题描述】:

我正在使用flask 的send_file 方法尝试让浏览器下载一个.txt 文件。问题是浏览器没有下载任何东西。

这是我的python函数:

@app.route('/download_zip', methods=['POST'])
def download_zip():
    file_name = 'test.txt'
    return flask.send_file(file_name, as_attachment=True, mimetype='text/plain')

这是触发 POST 请求的 jQuery 函数:

function batchDownload() {
    $.post('/download_zip', {
        file_name: 'temp.zip'
    }).done(function(data) {
        alert(data);
    }).fail(function() {
        alert('Error.  Could not download files :(');
    });
}

有趣的是.done(...) 回调中的alert(data) 将文件的内容显示给浏览器。所以浏览器正在接收文件内容但只是没有下载它。

有什么想法吗?

提前致谢!


编辑

在页面中添加了一个表单:

<form id="download"></form>

并将其添加到.done(...) 回调中:

    $form = $('#download');
    $form.submit();

我猜我需要以某种方式将服务器响应返回的数据(文件)链接到 POST 请求?

【问题讨论】:

    标签: html download flask


    【解决方案1】:

    这不是烧瓶相关的问题。 这就是浏览器和 javascript 的工作原理。

    您正在 Ajax 中下载文件,因此结果将传递给您的 Ajax 回调。

    你想让浏览器以他通常的方式下载数据。

    为此,您必须使用form 并在其上调用.submit() 方法。 只需在带有隐藏字段的页面中创建form 并在javascript 函数中提交即可。它应该可以解决问题。

    【讨论】:

    • 感谢您的回复!我明白了,是的,这是我的网站项目,有很多东西要学:) 我会试一试,然后回复你。
    • 好的,我添加了表单并从 javascript 函数提交(见编辑)。如何将文件链接到表单?
    • @nissemand 没有。您需要使用<form action="/download_zip" method="POST"><input type="hidden" name="param1" value="value1">...</form> 而不是使用Ajax,您只需.submit() 表单。这样浏览器直接执行POST并触发你的下载。
    • 保罗,你是个传奇!非常感谢:)
    猜你喜欢
    • 2019-05-13
    • 2016-01-08
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 2021-04-25
    • 2019-02-01
    相关资源
    最近更新 更多