未验证 提交 86938c49 编写于 作者: G George Claghorn 提交者: GitHub

Fix streaming downloads from S3/Azure Storage

Closes #31073.
上级 3f1695bb
......@@ -28,7 +28,7 @@ def upload(key, io, checksum: nil)
end
end
def download(key)
def download(key, &block)
if block_given?
instrument :streaming_download, key do
stream(key, &block)
......@@ -108,15 +108,15 @@ def format_expiry(expires_in)
end
# Reads the object for the given key in chunks, yielding each to the block.
def stream(key, options = {}, &block)
def stream(key)
blob = blob_for(key)
chunk_size = 5.megabytes
offset = 0
while offset < blob.properties[:content_length]
_, io = blobs.get_blob(container, key, start_range: offset, end_range: offset + chunk_size - 1)
yield io
_, chunk = blobs.get_blob(container, key, start_range: offset, end_range: offset + chunk_size - 1)
yield chunk.force_encoding(Encoding::BINARY)
offset += chunk_size
end
end
......
......@@ -26,7 +26,7 @@ def upload(key, io, checksum: nil)
end
end
def download(key)
def download(key, &block)
if block_given?
instrument :streaming_download, key do
stream(key, &block)
......@@ -85,14 +85,14 @@ def object_for(key)
end
# Reads the object for the given key in chunks, yielding each to the block.
def stream(key, options = {}, &block)
def stream(key, &block)
object = object_for(key)
chunk_size = 5.megabytes
offset = 0
while offset < object.content_length
yield object.read(options.merge(range: "bytes=#{offset}-#{offset + chunk_size - 1}"))
yield object.get(range: "bytes=#{offset}-#{offset + chunk_size - 1}").body.read.force_encoding(Encoding::BINARY)
offset += chunk_size
end
end
......
......@@ -50,6 +50,16 @@ module ActiveStorage::Service::SharedServiceTests
assert_equal FIXTURE_DATA, @service.download(FIXTURE_KEY)
end
test "downloading in chunks" do
chunks = []
@service.download(FIXTURE_KEY) do |chunk|
chunks << chunk
end
assert_equal [ FIXTURE_DATA ], chunks
end
test "existing" do
assert @service.exist?(FIXTURE_KEY)
assert_not @service.exist?(FIXTURE_KEY + "nonsense")
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册