diff options
author | George Claghorn <george.claghorn@gmail.com> | 2018-08-22 22:56:10 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-08-22 22:56:10 -0400 |
commit | dc001dbd58cde8b2caab42ab1bcdd88774818c53 (patch) | |
tree | 4704d8e8959bcd6569cc4244ec131e7dbedf87bc /activestorage/lib/active_storage/service/disk_service.rb | |
parent | cdee52079cdd88d376d9664a61a40348d45e819c (diff) | |
parent | 22efb2ec49087827ca1cb28a8bad9f016800c591 (diff) | |
download | rails-dc001dbd58cde8b2caab42ab1bcdd88774818c53.tar.gz rails-dc001dbd58cde8b2caab42ab1bcdd88774818c53.tar.bz2 rails-dc001dbd58cde8b2caab42ab1bcdd88774818c53.zip |
Merge pull request #33666 from cbothner/fail-gracefully-from-activestorage-file-not-found
Fail more gracefully from ActiveStorage missing file exceptions
Diffstat (limited to 'activestorage/lib/active_storage/service/disk_service.rb')
-rw-r--r-- | activestorage/lib/active_storage/service/disk_service.rb | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/activestorage/lib/active_storage/service/disk_service.rb b/activestorage/lib/active_storage/service/disk_service.rb index 9f304b7e01..52f3a3df16 100644 --- a/activestorage/lib/active_storage/service/disk_service.rb +++ b/activestorage/lib/active_storage/service/disk_service.rb @@ -22,27 +22,31 @@ module ActiveStorage end end - def download(key) + def download(key, &block) if block_given? instrument :streaming_download, key: key do - File.open(path_for(key), "rb") do |file| - while data = file.read(5.megabytes) - yield data - end - end + stream key, &block end else instrument :download, key: key do - File.binread path_for(key) + begin + File.binread path_for(key) + rescue Errno::ENOENT + raise ActiveStorage::FileNotFoundError + end end end end def download_chunk(key, range) instrument :download_chunk, key: key, range: range do - File.open(path_for(key), "rb") do |file| - file.seek range.begin - file.read range.size + begin + File.open(path_for(key), "rb") do |file| + file.seek range.begin + file.read range.size + end + rescue Errno::ENOENT + raise ActiveStorage::FileNotFoundError end end end @@ -122,6 +126,16 @@ module ActiveStorage end private + def stream(key) + File.open(path_for(key), "rb") do |file| + while data = file.read(5.megabytes) + yield data + end + end + rescue Errno::ENOENT + raise ActiveStorage::FileNotFoundError + end + def folder_for(key) [ key[0..1], key[2..3] ].join("/") end |