我有一个 rake 任务,它将生成一个特定的 CSV 文件。我希望能够下载将放在 /tmp 中的 CSV 文件。
我的应用程序托管在 Heroku 中。如何下载该 CSV 文件?
我有一个 rake 任务,它将生成一个特定的 CSV 文件。我希望能够下载将放在 /tmp 中的 CSV 文件。
我的应用程序托管在 Heroku 中。如何下载该 CSV 文件?
如果您只想一次性下载,可以尝试使用heroku exec
. 该exec
命令允许您创建与测功机的 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
Heroku 上的/tmp
目录就是这样——临时的。即使您将文件存储在文件中/tmp
,它也不会保留足够长的时间,以至于任何用户都可以访问它。相反,您应该研究像Amazon AWS这样的集成存储解决方案。
有了这些,您的用户应该能够直接从您的存储主机访问这些 CSV 文件,而无需占用任何 Heroku dynos/资源。
为什么必须将它放在 tmp 文件夹中?如果你生成一些东西,它必须是重要文件而不是临时文件......
解决方案很简单,只需将文件保存到公共目录(或公共目录的子目录)的方式设置您的 rake 任务
然后你可以打开/下载你的export.csv
使用
http://your-domain/[subdirectory-in-public-directory]/export.csv
网址
tmp 目录下的文件每天都被清空,tmp 目录住@:
/应用程序/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()