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

标签 ruby-on-rails ruby curl amazon-s3 rest-client

我一直在寻找,似乎无法找到一个好的解决方案。我的 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 确实将本地文件加载到内存中,那么在本地下载它不会为我节省任何东西。呵呵。

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

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

最佳答案

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

RestClient绝对支持流式上传。条件是,在有效负载中,您传递的内容不是字符串或散列,并且您传递的内容响应读取和大小。 (所以基本上是一个流)。

在 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/

相关文章:

javascript - CSS 在检索帖子时不设置样式,rails jquery

ruby-on-rails - Application.css.scss 导致 rails 4 出现问题

node.js - 无法让 nodejs 在 amazon ec2 实例上工作

java - curl 错误 : could not resolve host, java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1

ios - OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server session ticket A: sslv3 alert certificate revoked

javascript - 初学者 : How to store data in Ruby on Rails?

ruby-on-rails - Heroku语法错误;日志包含加扰的行号

ruby - 在被动评级系统中增加和减少 float 的算法

ruby-on-rails - 我如何在 rake 任务中强制使用 RAILS_ENV?

当 Content-Type 存在时,C libcurl 返回 null Content-Type。