Flask send_file作为附件不起作用

Fel*_*lix 3 html download flask

我正在使用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')
Run Code Online (Sandbox Code Playgroud)

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

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

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

有任何想法吗?

提前致谢!


编辑

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

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

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

    $form = $('#download');
    $form.submit();
Run Code Online (Sandbox Code Playgroud)

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

Pao*_*llo 9

这不是烧瓶相关的问题.这是浏览器和JavaScript的工作原理.

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

您希望以通常的方式使浏览器下载数据.

为此,您必须使用a form.submit()在其上调用方法.只需form在隐藏字段的页面中创建并在javascript函数中提交它.它应该做的伎俩.

  • @nissemand没有.你需要使用`<form action ="/ download_zip"method ="POST"> <input type ="hidden"name ="param1"value ="value1"> ... </ form>`而不是使用Ajax你只需`.submit()`表单.这样浏览器直接执行`POST`并触发下载. (2认同)