我从Heroku bash运行了一个ruby脚本,它在我想要下载的服务器上生成一个CSV文件。我尝试将其移动到公共文件夹进行下载,但这不起作用。我发现在Heroku bash控制台中的每个会话之后,文件都会被删除。是否有直接从Heroku bash控制台下载的命令?
答案 0 :(得分:45)
如果您设法从heroku run bash
创建文件,则可以使用transfer.sh。
您甚至可以在传输文件之前加密文件。
cat <file_name> | gpg -ac -o- | curl -X PUT -T "-" https://transfer.sh/<file_name>.gpg
然后在目标计算机上下载并解密
curl https://transfer.sh/<hash>/<file_name>.gpg | gpg -o- > <file_name>
答案 1 :(得分:7)
我做了如下:
首先我用这个命令输入了heroku bash:
heroku run&#39; sh&#39;
然后创建了一个目录并将文件移动到
在提交之前,git会询问您的姓名和电子邮件。给它假货!
如果您的文件大于100 Mg,请推送到gitlab。
如果有更简单的方法,请告诉我!
抱歉我的英语不好。
答案 2 :(得分:6)
Heroku dyno filesystems are ephemeral,非持续性且不在dynos之间共享。因此,当你执行heroku run bash
时,你实际上会获得一个新的dyno,它会重新部署你的app,而不会对其他dynos中的短暂文件系统进行任何更改。
如果你想做这样的事情,你可能要么在heroku run bash
会话中全部完成,要么全部在对Heroku上运行的Web应用程序的请求中执行,该应用程序使用您想要的CSV文件进行响应。
答案 3 :(得分:6)
我同意,很可能你的需求意味着改变你的应用程序架构,就像工作器dyno。
但是通过执行以下步骤,您可以传输文件,因为heroku one-off dyno可以运行scp
:
scp
从heroku one-off dyno到该vm服务器的文件; scp
文件从vm服务器到您的本地计算机; 答案 4 :(得分:3)
将文件从dyno复制到本地文件系统
用法 $ heroku ps:复制文件
但我最终遇到此错误:
Establishing credentials... error
▸ Could not connect to dyno!
▸ Check if the dyno is running with `heroku ps'
也许您会在此方面获得更大的成功。
答案 5 :(得分:3)
现在https://transfer.sh已失效,https://file.io是替代选择。要上传myfile.csv
:
$ curl -F "file=@myfile.csv" https://file.io
响应中将包含一个链接,您可以从以下位置访问文件:
{"success":true,"key":"2ojE41","link":"https://file.io/2ojE41","expiry":"14 days"}
我不能保证file.io的安全性,因此按照其他答案所述使用加密可能是个好主意。
答案 6 :(得分:2)
适用于在剪贴板中舒适放置的小型/快速转移:
heroku run bash
cat filename
答案 7 :(得分:0)
现在我创建了shell脚本来将一些文件从git backup repo上传(例如,我的app.db sqlite文件是gitignored,每次部署都会杀死它)
## upload dyno files to git via SSH session
## https://devcenter.heroku.com/changelog-items/1112
# heroku ps:exec
git config --global user.email 'dmitry.cheva@gmail.com'
git config --global user.name 'Dmitry Cheva'
rm -rf ./.gitignore
git init
## add each file separately (-f to add git ignored files)
git add app.db -f
git commit -m "backup on `date +'%Y-%m-%d %H:%M:%S'`"
git remote add origin https://bitbucket.org/cheva/appbackup.git
git push -u origin master -f
git将在部署后重新启动并且不存储环境,您需要执行前3个命令。 然后你需要添加文件(-f用于忽略的文件)并推入repo(-f,因为git需要拉动)
答案 8 :(得分:0)
Heroku dyno预先安装了 sftp 。我尝试了git,但是步骤太多(必须生成一个新的ssh证书并且每次都将它添加到github),所以现在我使用的是sftp并且效果很好。
您需要拥有另一位主持人(如dreamhost,hostgator,godaddy等) - 但如果您这样做,您可以:
sftp username@ftp.yourhostname.com
接受服务器指纹/哈希,然后输入密码。
进入服务器后,导航到要上传的文件夹(使用cd和ls命令)。
然后使用命令put filename.csv
,它会将其上传到您的网络主机。
要检索文件:如果您上传到www或网站文件夹路径中的文件夹,请使用ftz客户端(如filezilla)或点击网址。
这很棒,因为它也适用于多个文件和二进制文件以及文本文件。
答案 9 :(得分:0)
执行此操作的另一种方法(不涉及任何第三台服务器)是使用Patrick的方法,但首先将文件压缩为仅使用可见ASCII字符的格式。这应该使它适用于任何文件,而不管任何空格字符或异常编码。我建议使用base64
。
这是我的做法:
heroku run bash
base64 <your-file>
base64
将这些文本直接解压缩为一个新文件(在Mac上,我会pbpaste | base64 --decode -o <your-file>
进行压缩)答案 10 :(得分:0)
我看到这些答案要老得多,所以我假设这是一个新功能。对于像我这样寻求比此处给出的最佳答案更简单的解决方案的所有人,Heroku现在可以使用以下命令轻松复制文件:heroku ps:copy <filename>
请注意,这与相对路径一样,如您所愿。 (在heroku-18堆栈上进行了测试,可以从“ path / to / file.ext”下载文件
以供参考:Heroku docs
答案 11 :(得分:0)
TLDR:使用 Heroku Redis 作为存储机制。
以前的答案很好,但主要涉及用于导出文件的 3rd 方服务、用于生成文件的 Web 应用程序或用于从 heroku 运行会话推送文件的 ftp/scp/rsync。我的要求不允许我使用其中任何一个:
...对我有用:
最初面临的两个问题:
事实证明,我们可以通过使用简单的 Heroku Redis 插件来实现这两个目标。它将允许我们在应用程序内部(在 dynos 之间)以及与外部世界共享数据。
我还没有找到在 heroku run bash
会话中使用 redis-cli 的简单方法,所以我将 redis 库用于我拥有 buildpack 的语言(在我的情况下为 ruby)。
首先我们需要图书馆,所以:
gem install redis
然后我们需要将文件推送到 Redis。几行 ruby 就可以解决问题。
require "redis"
redis = redis = Redis.new(url: ENV["REDIS_URL"])
redis.set("some-key-name", IO.binread("path/to/file.csv"), ex: 1200)
说明:
ENV["REDIS_URL"]
这就是存储。现在可以跨应用程序内的 dyno 访问数据。 Heroku 也可以从 Internet 访问它。
可以通过 heroku redis cli 或再次通过 redis 驱动程序检索数据。
示例(通过 heroku redis:cli):
echo 'GET some-key-name' | redis:cli > file.out
file.out 现在应该有数据了。
我们需要清理数据,因为 redis:cli
信息消息也在那里被捕获。
(我还没有找到禁用它们的方法,但我看起来不够努力)。
示例(ruby 驱动程序): 我们需要先获取redis URL(为了简单起见,将其保存为REDIS_URL):
REDIS_URL=$(heroku redis:credentials)
确保安装了 redis gem:
gem install redis
用于获取数据的 Ruby 脚本如下所示:
require "redis"
redis = Redis.new(url: ENV["REDIS_URL"])
IO.binwrite("output/file.txt", redis.get("some-key-name"))
免责声明: