为了账号安全,请及时绑定邮箱和手机立即绑定

烧瓶 send_file / send_from_directory 返回 200 状态码但不是文件

烧瓶 send_file / send_from_directory 返回 200 状态码但不是文件

Go
慕侠2389804 2022-01-18 13:47:51
我正在尝试从我的 Flask 应用程序发送文件成功send_file()或send_from_directory()失败。该请求返回一个响应,status_code=200但没有下载文件。我已经验证了函数的工作原理,因为当文件或目录不存在时它们会返回错误这是我函数的最后一行。它处理POST请求并在保存后应返回一个文件。# openpyxl stuff abovewb.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 -我验证了文件确实正在创建和保存,并且我验证了如果路径错误或文件不存在,上面的最后一行返回错误。为什么会这样?
查看完整描述

3 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

我也遇到过这种问题。我还使用烧瓶和 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 由于某种原因无法使用这个响应。


添加了我在上面的代码中得到的响应片段:


在查看文档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() contentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' 中使用的 mimetype 相同;


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


查看完整回答
反对 回复 2022-01-18
?
慕斯709654

TA贡献1840条经验 获得超5个赞

弄清楚了。我axios用来处理我的POST请求。似乎 javascriptPOST请求没有返回文件的能力。

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

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


查看完整回答
反对 回复 2022-01-18
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

formenctype = "multipart/form-data"吗?

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


查看完整回答
反对 回复 2022-01-18
  • 3 回答
  • 0 关注
  • 448 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信