【问题标题】:Downloading a file in downloads directory - flask, python在下载目录中下载文件-flask,python
【发布时间】:2021-06-08 21:09:30
【问题描述】:

我有一个烧瓶应用程序,其中有一个下载 HTML 报告的按钮。点击下载按钮会创建一个 xlsx 文件。在该应用程序在我的本地服务器上运行之前它运行良好,因为无论它使用什么操作系统,python 代码都找到了我的 Downloads 目录。使用 python 的 os 模块。

现在应用程序部署在远程服务器上,在这种情况下,如何让系统知道客户端的下载目录路径,然后可以在其中创建此 xlsx 文件?或者如果我遗漏了什么,是否有其他更好的解决方案?

【问题讨论】:

  • 服务端不能在客户端指定下载目录,只能指定文件名(如使用Flask的send_file函数,可以传递attachment_filename arg,后者又传递正确的Content-Disposition HTTP 标头)。见another answer我写的有点与这个话题有关。

标签: python django flask operating-system


【解决方案1】:

要为用户提供下载文件,网络服务器需要以一种特殊的方式传送它。您不能使用os 模块写入用户的计算机。它在本地工作,因为您的服务器与浏览器中的用户环境是同一台计算机。

为用户提供下载文件的正确方法是使用flask的send_file方法。

为了向您展示该过程,我在下面创建了一个示例。在此示例中,我假设您有一个名为 build_report(...) 的函数,它接受 report_id 并返回一个包含 xlsx 文件内容的 io.BytesIO 对象。

from flask import send_file

@app.route("/download-report/<report_id>")
def download_report(report_id):
    file_obj = build_report(report_id)
    return send_file(
        file_obj,
        mimetype="application/vnd.ms-excel",
        attachment_filename=f"report-{report_id}.xlsx",
    )

【讨论】:

    【解决方案2】:

    如果我理解正确 - 你想指定一个目录,当他/她点击下载按钮时,文件应该下载到用户计算机上。

    这是不可能的,完全由浏览器处理。

    浏览器处理特殊类型的请求/流,然后在用户在浏览器设置中指定的位置创建输出文件。您提到的os 库与您的服务器机器而不是客户端相关,因此您在代码中提供的任何os 操作都将在您的服务器上执行(例如创建文件)。所以这就是它在您的本地机器上工作的原因——它同时是服务器和客户端。

    为什么不同意?

    想象一个“病毒文件”被上传到您的 C:\Windows\System32。 Web 应用程序可以通过一个简单的按钮下载来控制您的机器。巨大的安全问题不允许客户端从 Web 应用程序访问机器

    【讨论】:

    • 我知道为什么当应用程序在我的本地服务器上时它会起作用,但我不知道如何实现下载部分。我接受的另一个答案向我展示了这样做的方法。我完全走错了路。但是感谢您提供有用的信息,特别是强调我尝试这样做的方式会造成的安全威胁。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    相关资源
    最近更新 更多