Rails:如何将文件从S3发送到远程服务器

Rails:如何将文件从S3发送到远程服务器

问题描述:

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

我使用RESTClient实现张贴到第三方服务器这样的:

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直接发送一个远程文件到这个第三方服务?

我找到了答案在这里如果有人用开放式的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。我没有能力改变任何事情。

+0

'remote-server-url.com'能不能下载文件本身?这对你来说会容易得多,你将能够摆脱额外的网络往返“将文件下载到我的服务器并再次发送到远程服务器”。 –

+0

关于你的问题的真棒答案在这里:http://stackoverflow.com/a/12282709/1426097,与您的服务器上的0 - 责任:) – dimakura

+0

@AlexeyShein,不幸的是,我不能控制什么远程服务器。它只是一个监听文件有效负载的API。 – BoomShadow

看看: 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将您的阅读器传递给RestClient :: Payload.generate并将其用作您的有效内容。如果阅读部分比写作部分慢,你仍然可以在内存中阅读很多内容。你想在写作时只接受你愿意在内存中缓冲的数量。您可以使用writer.stat.size(fork内部)读取流的大小,并在它超过特定大小时旋转它。

+0

哇。这很有意义。我会试试这个。我将其标记为接受的答案,因为它看起来正是我所需要的。非常感谢!你真的太棒了。 – BoomShadow

+0

当然。如果这有效,则为lmk。如果你沿途遇到任何困难,我实际上可以尝试整理一个完整的代码示例。 – Mircea