如何使用内容处置将CSV导出到Flask中的绝对路径



我在Flask应用程序中有以下代码:

@app.route('/transform', methods=['POST'])
def transform_view():
//other irrelevant codes
resp = make_response(data1.to_csv())
resp.headers['Content-Disposition'] = 
'attachment; filename= export.csv'
resp.headers['Content-Type'] = 'text/csv'
return resp

每当我单击前端的下载csv文件按钮时,export.csv都会下载到Downloads文件夹中。但我想将其导出到我的项目所在的目录,即C:\Users\Admin\Desktop\cracp9\flask

我试着做:

resp.headers['Content-Disposition'] = 
"attachment; filename= r'C:UsersAdminDesktopcrap9flaskexport.csv'"

但抛出

文件"。\app.py";,第480行";附件filename=C:\Users\Admin\Desktop\cracp9\flask\export.csv"^
SyntaxError:(unicode错误("unicodeescape"编解码器无法解码字节在位置24-25:截断\UXXXXXXXX转义

这并不是真正回答您的异常/unicode错误,而是关于使用Content-Disposition的一些建议。。。

attachment指令并不意味着包含完整路径。参见MDN文档:

文件名始终是可选的,应用程序不得盲目使用:路径信息应被剥离,并应转换为服务器文件系统规则。该参数主要提供指示性信息。当与Content-Disposition: attachment组合使用时,它被用作最终"的默认文件名;另存为";对话框。

所以当你提到:

export.csv下载在下载文件夹中。但我想将其导出到我的项目所在的目录,即C:\Users\Admin\Desktop\crap9\flack

选择下载文件夹是因为您的浏览器配置将其作为默认的另存为位置。这不能通过服务器的头进行调整。如果您真的想把它保存到服务器的文件系统中,那么建议使用标准的python方法。类似于:

with open('export.csv', 'wb') as f:
f.write(data1.to_csv())

我认为您可能混淆了服务器的文件系统和客户端的文件系统,因为在这个阶段您正在本地运行应用程序。当部署时,这是两件完全独立的事情。该完整路径将不存在于客户端filestm中,并且使文件可下载给最终用户的transform_view功能无法指定浏览器下载后将保存到哪个目录。

因此,明智的做法是决定是实际保存到服务器的文件系统,还是在客户端可以选择保存位置的地方下载文件(您仍然可以设置文件名本身(。

最新更新