我有一个rake任务会生成一个特定的CSV文件。我希望能够下载将放在/ tmp。
中的CSV文件我的应用程序托管在Heroku中。如何下载该CSV文件?
答案 0 :(得分:1)
Heroku上的/tmp
目录就是 - 临时的。即使您将文件存储在/tmp
文件中,它也不会持久,以至于任何用户都无法访问它。相反,您应该研究像Amazon AWS这样的集成存储解决方案。
有了这些,您的用户应该能够直接从存储主机访问这些CSV文件,而无需占用任何Heroku dynos /资源。
答案 1 :(得分:0)
为什么有必要将它放在tmp文件夹中?如果你生成一些东西,它必须是重要的文件而不是暂时的...
解决方案很简单,只需在将文件保存到公共目录(或公共目录的子目录)时设置rake任务
然后您可以使用
打开/下载export.csv
http://your-domain/[subdirectory-in-public-directory]/export.csv
网址
答案 2 :(得分:0)
如果您只想一次性下载,则可以尝试使用heroku exec
。 exec
命令允许您创建到dyno的SSH连接-https://devcenter.heroku.com/changelog-items/1112
首先,找出文件路径。您可以运行bash
,然后执行常用的bash命令,例如ls
:
heroku ps:exec -a <myapp> bash
接下来,使用cat
读取文件,并将输出通过管道传输到本地文件:
heroku ps:exec -a <myapp> cat tmp/myfile.csv > mylocal.csv
答案 3 :(得分:0)
tmp目录中的文件每天都被清空,tmp目录位于@:
/ app / tmp
其中app是根目录
要从中下载文件,您可以读取文件并将其转换为base 64并将其作为数据URL发送回客户端:
服务器:
let filePath = path.join(__dirname, '..', '..', 'tmp', fileName);
fs.readFile(filePath, {encoding: 'base64'}, function (err, data) {
if (!err) {
let returnData = `data:${mimeType};base64,` + data;
res.json({fileName: fileName, displayName: displayName, base64: returnData})
} else {
console.log(err);
}
});
客户端:
function b64toBlob(dataURI) {
var byteString = atob(dataURI.split(',')[1]);
var ab = new ArrayBuffer(byteString.length);
var ia = new Uint8Array(ab);
for (var i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
return new Blob([ab], { type: 'image/jpeg' });
}
var blob = b64toBlob(res.data.base64);
var blobUrl = URL.createObjectURL(blob);
var link = document.createElement("a"); // Or maybe get it from the current document
link.href = blobUrl;
link.download = res.data.displayName;
document.body.appendChild(link)
link.click()