I have an app hosted @ Heroku. The app depends on some feeds which are fetched using a socket listener. The socket listener gets one line of XML per second. Once I detect the end of file signal from the listener, I upload the file to Amazon S3 servers. But, until the end of file signal is received, is it possible to save the file content as a temporary file in Heroku?
Heroku has an “ephemeral” hard drive, this means that you can write files to disk, but those files will not persist after the application is restarted. By default Active Storage uses a :local storage option, which uses the local file system to store any uploaded files.
Temporary files, also called temp or tmp files, are created by Windows or programs on your computer to hold data while a permanent file is being written or updated. The data will be transferred to a permanent file when the task is complete, or when the program is closed.
Files are uploaded directly to the cloud from your user's browser, without passing through your application. Adding direct uploads to your app allows you to offload the storage of static files from your app. This is crucial on Heroku, because your app's dynos have an ephemeral filesystem.
Heroku Postgres provides a managed SQL database as a service that is easily accessible from your Heroku applications to persist and manipulate data. All plans feature automatic health checks, off-premises storage, daily backups, SSL-protected access, dataclips, Postgres extensions, and a web Ul.
You may be able to use the #{RAILS_ROOT}/tmp/
directory or Rails.root.join('tmp').to_s
:
Aspen & Bamboo
[...]
There are two directories that are writeable:./tmp
and./log
(under your application root).
[...]Cedar
Cedar offers an ephemeral writeable filesystem. You can write out to disk anywhere you would like. Your changes will be lost on dyno restart and spin-up.
RAILS_ROOT
is for older Rails versions, Rails.root
is for newer versions.
You can't depend on anything surviving across requests of course, there's no guarantee that you'll even be working with the same dyno.
As long as you stay within the same process or request, Rails.root.join('tmp')
should be usable. If you need the temporary data to survive across requests or processes then you're better off using something else (such as MongoDB or PostgreSQL) as a collecting ground for your data on its way to S3.
Thanks to Benjamin Wheeler for the heads up about the RAILS_ROOT
to Rails.root
change.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With