gpt4 book ai didi

ruby-on-rails - rails : How to send file from S3 to remote server

转载 作者:数据小太阳 更新时间:2023-10-29 08:44:48 24 4
gpt4 key购买 nike

我一直在四处寻找,似乎无法为此找到好的解决方案。我的 Rails 应用程序将其文件存储在 Amazon S3 中。我现在需要将它们发送到远程(第 3 方)服务。

我正在使用 RestClient 像这样发布到第 3 方服务器:

send_file = RestClient::Request.execute(
:method => :post,
:url => "http://remote-server-url.com",
:payload => File.new("some_local_file.avi", 'rb'),
:multipart => true,
etc.... )

它适用于本地文件,但我如何才能将远程文件从 S3 直接发送到此第 3 方服务?

我在这里找到了有人使用 open-uri 的答案:ruby reading files from S3 with open-URI

我自己测试过,它有效。

:payload => open(URI.parse("http://amazon-s3-example.com/some_file.avi"))

但是,我在这里读到一条评论说 open-uri 只是将远程文件加载到内存中。请参阅对此答案的最后评论:https://stackoverflow.com/a/264239/2785592

这不太理想,因为我正在处理可能很大的视频文件。我还在某处读到 RestClient 甚至将本地文件加载到内存中;同样,这并不理想。有谁知道这是不是真的?

当然,我不可能是唯一遇到此问题的人。我知道我可以在发送之前在本地下载 S3 文件,但我希望节省时间和带宽。此外,如果 RestClient 真的 确实 甚至将本地文件加载到内存中,那么在本地下载它并不能为我节省任何东西。呵呵。

如有任何建议,我们将不胜感激。谢谢:)

更新:远程服务器只是一个响应发布请求的 API。我没有能力改变他们的任何事情。

最佳答案

看看: https://github.com/rest-client/rest-client/blob/master/lib/restclient/payload.rb

RestClient 绝对支持流式上传。条件是在 payload 中你传递的东西不是字符串或散列,并且你传递的东西响应读取和大小。 (所以基本上是一个流)。

在 S3 端,您基本上需要抓取一个流,而不是在发送之前读取整个对象。您使用 http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Client.html#get_object-instance_method你说你想在响应目标中获得一个 IO 对象(不是字符串)。为此,您可以使用 IO.pipe

reader, writer = IO.pipe

fork do
reader.close
s3.get_object(bucket: 'bucket-name', key: 'object-key') do |chunk|
writer.write(chunk)
end
end

writer.close

您将读取器传递给 RestClient::Payload.generate 并将其用作您的负载。如果阅读部分比写作部分慢,您可能仍会在内存中阅读很多内容。你想要的,在写入时只接受你愿意在内存中缓冲的数量。您可以使用 writer.stat.size(在 fork 内)读取流的大小,并在它超过特定大小后旋转它。

关于ruby-on-rails - rails : How to send file from S3 to remote server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32801731/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com