从Heroku中的/ tmp文件夹下载

时间:2013-07-08 11:53:57

标签: ruby-on-rails csv tmp

我有一个rake任务会生成一个特定的CSV文件。我希望能够下载将放在/ tmp。

中的CSV文件

我的应用程序托管在Heroku中。如何下载该CSV文件?

4 个答案:

答案 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 execexec命令允许您创建到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()