【问题标题】:Flask send_file / send_from_directory returning 200 status code but not the file烧瓶 send_file / send_from_directory 返回 200 状态码但不是文件
【发布时间】:2019-09-11 06:15:04
【问题描述】:

我正在尝试通过 send_file()send_from_directory() 从我的 Flask 应用程序发送文件,但没有成功。

请求返回带有status_code=200 的响应,但没有下载文件。我已经验证了函数的工作原理,因为当文件或目录不存在时它们会返回错误

这是我函数的最后一行。它处理POST 请求,并应在保存后返回一个文件。

# openpyxl stuff above
wb.save(app.instance_path + '/path/to/file/spreadsheet.xlsx') 

return send_file(current_dir + '/path/to/file/spreadsheet.xlsx')

这是从服务器返回的内容

127.0.0.1 - - [21/Apr/2019 20:05:26] "POST /api/admin/export_bookings HTTP/1.1" 200 -

我验证了文件确实正在创建和保存,并且如果路径错误或文件不存在,我已经验证了上面最后一行返回错误。

为什么会这样?

【问题讨论】:

    标签: python flask axios


    【解决方案1】:

    我也遇到过这种问题。 我还使用 flask 和 send_file() 库将文件发送到 UI 以供用户下载。

    我只是使用下面的烧瓶发送文件。

    @app.run('/download_any_file',methods=['POST'])
    def download():
      path='folder_path_where_file_exist'
      filename='abcde.xlsx' # i am getting this filename from UI
      full_path=path+'/'+ filename
      return send_file(full_path,as_attachment=True)
    

    我从该 API 获得了一些响应,但 UI 由于某种原因无法使用该响应。

    added a snip of Response I was getting with above code:

    查看文档https://tedboy.github.io/flask/generated/flask.send_file.html 后,我发现excel 文件(.xlsx) 或(.xls) 的一个参数“mimetype”应作为参数传递。注意:(.xlsx 和 .xls)的 mimetype 不同,请按照此链接查找不同文件的 mimetype https://docs.microsoft.com/en-us/archive/blogs/vsofficedeveloper/office-2007-file-format-mime-types-for-http-content-streaming-2.

    我最终改变了我的代码如下:

    @app.run('/download_any_file',methods=['POST'])
    def download():
      path='folder_path_where_file_exist'
      filename='abcde.xlsx' # i am getting this filename from UI
      full_path=path+'/'+ filename
      return send_file(full_path,as_attachment=True,mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
    

    现在应该在 UI 端使用相同的 mime-type 来捕获和解码响应并将其放入 excel 文件中进行下载。 在 UI 中 contentType 应该与烧瓶 send_file() 中使用的 mimetype 相同 contentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';

    这样你就可以下载一个excel文件了。

    【讨论】:

      【解决方案2】:

      想通了。我正在使用axios 来处理我的POST 请求。看来javascriptPOST请求没有返回文件的能力。

      我找到了一种解决方法,将'/path/to/file/spreadsheet.xlsx' 作为JSON 返回到我的javascript 并使用该路径调用window.open()

      然后我只需要创建一个标准的 Flask GET 路由 @bp.route('/path/to/file/<filename>) 使用该 send_file() 函数通过 url 从目录返回文件。

      【讨论】:

        【解决方案3】:

        您的formenctype = "multipart/form-data"

        您是否检查了请求中是否存在该文件?

        【讨论】:

        • 我在回复的data 部分看到了一些奇怪的符号,这是它的一个小sn-p PK���N�����docProps/app.xmlM�M…��&[Content_Types].xml
        • 'Content-Type' 的价值是什么?
        • 多部分/表单数据。也许值得一提,这是一个 POST 请求。当我通过简单的 GET 请求尝试将相同的函数作为单独的 Flask 函数的一部分时,它会毫无问题地返回文件。
        • 你在header中定义了什么参数?
        • 我尝试了多种,但没有一个。我经历了content-typemimetypecontent-disposition
        猜你喜欢
        • 2020-12-16
        • 1970-01-01
        • 1970-01-01
        • 2022-01-21
        • 2019-05-13
        • 2020-04-26
        • 2021-03-20
        • 2011-12-11
        • 2016-01-08
        相关资源
        最近更新 更多