【问题标题】:Downloading from /tmp folder in Heroku从 Heroku 中的 /tmp 文件夹下载
【发布时间】:2013-07-08 11:53:56
【问题描述】:

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

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

【问题讨论】:

标签: ruby-on-rails csv tmp


【解决方案1】:

如果您只想一次性下载,可以尝试使用heroku execexec 命令允许您创建与测功机的 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

【讨论】:

    【解决方案2】:

    Heroku 上的 /tmp 目录就是这样——临时的。即使您将文件存储在/tmp 文件中,它也不会保留足够长的时间,以至于任何用户都可以访问它。相反,您应该研究像Amazon AWS 这样的集成存储解决方案。

    有了这些,您的用户应该能够直接从您的存储主机访问这些 CSV 文件,而无需占用任何 Heroku dynos/资源。

    【讨论】:

    • 其实只有我自己会下载 CSV 文件。 zeantsoi,您建议使用哪个 gem 来将文件从 /tmp 推送到 Amazon s3?
    • 无论哪种方式,Heroku 都禁止您以所述方式从/tmp 目录访问文件。如果我没记错的话,你已经在别处问过你的问题了——我已经在那里回答过了:stackoverflow.com/questions/17526321/…
    【解决方案3】:

    为什么要把它放在 tmp 文件夹中?如果你生成一些东西,它必须是重要文件而不是临时文件......

    解决方案很简单,只需将文件保存到公共目录(或公共目录的子目录)的方式设置您的 rake 任务

    然后您可以使用

    打开/下载您的export.csv

    http://your-domain/[subdirectory-in-public-directory]/export.csv网址

    【讨论】:

    • OP 明确声明他们正在使用 Heroku,它不允许本地文件存储。
    • okay =)...比我建议的有点“令人毛骨悚然”的方法 - 用 Mailer 发送 - guides.rubyonrails.org/action_mailer_basics.html(你也可以找到令人愉快的邮件宝石)... 是否允许?
    【解决方案4】:

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多