2017-06-07 17 views
2

我有一个让用户上传视频的rails应用。目前,它在本地运行良好,我想将其移至AWS,以便用户上传视频时将其添加到我的S3存储桶中。将用户上传的视频从本地移动到亚马逊S3 in rails应用

现在,我的视频uploader.rb看起来是这样的:

class VideoUploader < CarrierWave::Uploader::Base 

    storage :file 

    def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
    end 

end 

什么我必须在这里改变,因此它会被上传到S3?

我也读过一点关于FOG的宝石。据我所知,它可以帮助您在本地和云上上传视频。我必须在这里使用它吗?对不起,如果我以错误的方式提出这个问题,我在这里是新的,也对铁轨。

非常感谢,并请让我知道如果你需要任何更多的信息。

回答

0

您将要使用的fog-aws宝石。

在你Gemfile添加

gem 'fog-aws' 

创建initializer并将其命名为类似carrierwave.rb。然后,您将会把您的凭据在这里:

CarrierWave.configure do |config| 
    config.fog_provider = 'fog/aws'       # required 
    config.fog_credentials = { 
     provider:    'AWS',      # required 
     aws_access_key_id:  ENV['aws_access_key_id'],  # required 
     aws_secret_access_key: ENV['aws_secret_access_key'], # required 
    } 
    config.fog_directory = ENV['bucket']     # required 
end 

使用ENV变量来隐藏自己的AWS信息。

你也想改变storage :filestorage :fog

有关文件上传与S3和Carrierwave完整的信息,请查阅documentation

由于大尺寸的视频(假设),我可能会移动上传过程为背景的工作,所以你的web服务器不超时。

+0

非常感谢,先生!我会尝试一下 – Dinukaperera

+0

如何让上传成为后台工作? – Dinukaperera

+0

你可以使用'sidekiq'。在您的控制器操作中,您可以将参数传递给后台作业。 – jdgray

1

您可以对Ruby代码进行以下更改以上传视频并允许流式传输视频。

  • 设置AWS CloudFront与RTMP Distribution为Streaming Videos上传到S3。
  • 使用Ruby SDK for Signed URLs创建签名URL(验证访问控制),并从一个Rails端点返回响应给浏览器,以便使用特定标识的URL,浏览器中运行Web应用程序可以直接将文件上传到S3。

使用AWS CloudFront url上传文件后,您可以将视频流式传输到浏览器中的视频播放器。

+0

Hey Ashan,我会研究RTMP并让你知道它是怎么回事。它看起来像很多的阅读。另外,当您说使用AWS CloudFront url进行流式传输时,这是否意味着在我的视频视图代码中使用它,或者您在谈论其他事情? – Dinukaperera

+0

当您将文件上传到S3时,应该有一些中介支持来在文件仍被下载到浏览器时播放该文件的内容。您需要使用CloudFront RTMP分配。通过以下文档http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/HowStreamingDistributionsWork.html – Ashan