首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Flask send_file / send_from_directory返回200状态码,但不返回文件

Flask send_file / send_from_directory返回200状态码,但不返回文件
EN

Stack Overflow用户
提问于 2019-04-22 08:14:56
回答 3查看 2K关注 0票数 0

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

该请求返回一个带有status_code=200的响应,但没有正在下载的文件。我已经验证了这些函数在文件或目录不存在时返回错误的情况下是否正常工作

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

代码语言:javascript
运行
复制
# openpyxl stuff above
wb.save(app.instance_path + '/path/to/file/spreadsheet.xlsx') 

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

这是从服务器返回的内容

代码语言:javascript
运行
复制
127.0.0.1 - - [21/Apr/2019 20:05:26] "POST /api/admin/export_bookings HTTP/1.1" 200 -

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

为什么会发生这种情况?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-22 09:18:16

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2019-04-22 08:32:08

你的formenctype = "multipart/form-data"吗?

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

票数 0
EN

Stack Overflow用户

发布于 2020-09-19 13:10:10

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

我只是使用flask发送文件,如下所示。

代码语言:javascript
运行
复制
@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是不同的,请点击这个链接找到不同文件https://docs.microsoft.com/en-us/archive/blogs/vsofficedeveloper/office-2007-file-format-mime-types-for-http-content-streaming-2的mimetype。

我最终修改了我的代码,如下所示:

代码语言:javascript
运行
复制
@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类型来捕获和解码响应,并将其放入excel文件中进行下载。在UI中,contentType应该与flask send_file() contentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';中使用的same类型相同

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55787862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档