我一直在编写一个在Heroku上部署的应用程序。到目前为止,一切都很好。但是,还有一个我无法解决的最后一步:我需要从数据库中即时生成CSV文件,让用户下载文件。
在我的本地计算机上,我只需将文件写入Web应用程序根目录下的文件夹,例如# Labeling the clusters
centers = clusterer.means_
,然后将浏览器重定向到/output
以获取文件。
然而,无论我如何尝试修改它,相同的代码在Heroku上一次又一次失败。它要么抱怨无法写入文件,要么无法将浏览器重定向到正确的路径。
即使我手动使用http://localhost:4000/output/1.csv
并在项目根目录中创建heroku run bash
文件夹并在那里创建文件,当我尝试将浏览器定向到那里时(例如/output
),它只是说“找不到页面”。
毕竟不可能对Heroku执行这样的操作吗?我认为既然我们可以自由地在短暂的文件系统上创建文件,我们也应该可以从浏览器访问它,但事情似乎比这更复杂。
我正在使用Phoenix框架,我已经添加了
https://myapp.herokuapp.com/output/1.csv
到我的plug Plug.Static,
at: "/output", from: Path.expand("output/"), gzip: false
。显然它适用于endpoint.ex
但不适用于Heroku?
如果确实我想要做的事情是不可能的,我将转向亚马逊S3。但是,我希望尽可能避免使用S3,因为这应该是一个非常简单的任务,我不想添加另一组凭据/额外的复杂性来管理。或者有没有其他方法来实现我正在尝试做的事情,而不必先将文件写入文件系统,然后将用户重定向到它?
答案 0 :(得分:1)
我知道它没有严格回答您的问题,但如果您不介意每次请求生成CSV,您可以使用Controller.send_download/3
并提供任意有效负载作为下载(在您的情况下, CSV的内容。
当然,你可以将生成的CSV存储在某个地方(比如数据库甚至ets)并“懒洋洋地”生成它们。