首页 > 解决方案 > Python Flask,从服务器下载文件

问题描述

我创建了一个 Web 应用程序,它允许其用户从运行该应用程序的同一台服务器下载文件。但是,我无法让它按照我想要的方式工作,现在我什至不确定它是否可能。

所以,我有一个表单,其中包含两个用户输入和一个“下载”按钮。第一个用户输入让您选择文件,第二个用户输入让您选择数量。当您点击下载按钮时,应用程序会根据用户输入创建一个 zip 文件,并尝试将其发送给用户。无论如何,zip 文件永远不会发送给用户。

这是按钮在 html 中的样子

<input type="submit" name="submit" value="Download" class="btn" >

下面是send_file()应用程序中的函数调用。

send_file(uploads + cfg_zipfile, attachment_filename=cfg_zipfile, as_attachment=True)

该函数返回状态 200,因此它似乎正在工作。仍然没有发送文件,但文件存在于服务器上。那么,这甚至可以这样做吗?我知道我可以使用按钮创建 zip 文件,然后会出现一个下载链接,用户可以从该链接下载它,但是是否可以通过一个按钮获得所有这些功能?目前 zip 文件的名称还取决于用户输入(选择的文件和数量)。

标签: pythonhtmlflask

解决方案


我认为你应该创建一个服务

 <button ng-show='downloadReportview' data-toggle="modal"  class="btn btn-success glyphicon glyphicon-download">
    <a href="http://{{location}}/api/xx/xxxx//{{costDataReportName}}"  download>Download Report</a>
  </button>

这将使用 GET 方法调用服务。python中的服务看起来像这样:

def get(self, filename):
    # RETURN THE INVOICE
    file_name = str(expanduser("~")) + UPLOAD_PATH + str(filename)
    f = open(file_name, "rb")
    output = f.read()
    self.set_header('Content-Disposition', 'attachment; filename=output.csv')
    self.set_header('Content-type', 'text/csv')
    self.write(output)
    print("Invoice download")

推荐阅读