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

我正在尝试从我的 Flask 应用程序发送文件成功send_file()或send_from_directory()失败。


该请求返回一个响应,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 -

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


为什么会这样?


慕侠2389804
浏览 449回答 3
3回答

慕田峪7331174

我也遇到过这种问题。我还使用烧瓶和 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文件。

慕斯709654

弄清楚了。我axios用来处理我的POST请求。似乎 javascriptPOST请求没有返回文件的能力。我通过返回'/path/to/file/spreadsheet.xlsx'到我的 javascript as并使用该路径JSON调用找到了一种解决方法。window.open()然后我只需要创建一个标准的 FlaskGET路由@bp.route('/path/to/file/<filename>),使用该send_file()函数通过 url 从目录返回文件。

摇曳的蔷薇

你form有enctype = "multipart/form-data"吗?您是否检查了请求中是否存在该文件?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go