烧瓶 send_file 不适用于 tar.gz 文件

Posted

技术标签:

【中文标题】烧瓶 send_file 不适用于 tar.gz 文件【英文标题】:flask send_file not working with tar.gz files 【发布时间】:2016-01-08 22:20:54 【问题描述】:

我有一个带有结构的 my_folder.tar.gz 存档

my_folder.tar.gz:
    my_folder/
        file1
        file2

我构建了一个基本的烧瓶端点,比如:

@blueprint.route('/download')
def download():
    return send_file('/path/to/my_folder.tar.gz',
                     as_attachment=True,
                     attachment_filename='my_name.tar.gz')

当我第一次运行它时,一切运行顺利,浏览器下载了正确的存档。问题是当我第二次运行它时,存档中有一个文件my-name.tar-1,而不是我希望发送的文件夹。我再试一次,文件名my-name.tar-2等等等等。

事实证明,当我将attachment_filename 参数更改为新值时,下载会再次运行,但也只会运行一次。 send_from_directory() 函数也会出现同样的情况。

这是一种非常奇怪的行为。有人知道会发生什么吗?

【问题讨论】:

听起来您的客户正在重命名文件。当存在名称冲突时,许多浏览器都会这样做。如果在第二次下载之前删除已下载的文件会怎样? 嗯,实际上当我将它下载到硬盘上时,一切都很好。只有当我在浏览器对话框中单击Open with 而不是Save file 时才会出现此问题。 【参考方案1】:

你必须使用,

return send_file('/path/to/my_folder.tar.gz',as_attachment=True, attachment_filename='my_name.tar.gz, cache_timeout=0')

【讨论】:

以上是关于烧瓶 send_file 不适用于 tar.gz 文件的主要内容,如果未能解决你的问题,请参考以下文章

tar.gz 压缩不适用于 GIF 文件

send_file()后烧瓶无法删除文件[重复]

在 Pythonanywhere 上的烧瓶中替代 send_file()?

使用烧瓶中的 send_file() 时文件损坏,pymongo gridfs 中的数据

send_file 用于 Sinatra 中的临时文件

更新烧瓶中的 SQL 查询不适用于浮点/小数点