我正在尝试通过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 -
我验证了文件确实正在创建和保存,并且如果路径错误或文件不存在,我已经验证了上面最后一行返回错误。
为什么会发生这种情况?
发布于 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返回目录中的文件。
发布于 2019-04-22 08:32:08
你的form
有enctype = "multipart/form-data"
吗?
您是否检查了请求中是否存在该文件?
发布于 2020-09-19 13:10:10
我也遇到过这样的问题。我还使用flask和send_file()库将文件发送到UI供用户下载。
我只是使用flask发送文件,如下所示。
@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。
我最终修改了我的代码,如下所示:
@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文件。
https://stackoverflow.com/questions/55787862
复制相似问题