从AWS S3存储桶

时间:2018-02-08 18:35:08

标签: ruby-on-rails amazon-s3

我正在构建一个相当基本的Ruby on Rails应用程序,我将使用大约2000个图像,这是我第一次真正深入了解aws / s3。该应用程序不会有任何用户交互,所以我不确定是否最好将所有图像都放在应用程序上,然后将它们上传到我的存储桶,或者手动将它们添加到我的存储桶中,然后将它们下载到那里的应用程序。 AWS文档有点遍布。

我目前安装了carrierwave,不确定接下来的步骤应该是什么,或者如何将图像从S3检索到rails。我也将使用Heroku,但我已经使用我的AWS凭证设置了配置。

  

上传/ photo_uploader.rb

class PhotoUploader < CarrierWave::Uploader::Base

storage :fog

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

def content_type_whitelist
  /image\//
end
end
  

初​​始化/ carrierwave.rb

CarrierWave.configure do |config|
 config.fog_provider = 'fog/aws'
 config.fog_credentials = {
  provider: "AWS",
  aws_access_key_id: ENV["AWS_ACCESS_KEY_ID"],
  aws_secret_access_key: ENV["AWS_SECRET_ACCESS_KEY"]
 }
 config.fog_directory  = ENV["S3_BUCKET"]
end

2 个答案:

答案 0 :(得分:0)

您需要在安装carrierwavefog-aws后使用应用上传所有图片,然后您需要创建model controllerform来上传图片

好的,目前你已经混淆了如何在上传后显示图片,对吗?

简单的说法是,如果图像正确上传,那么表格为images,模型为Image,列为picture,因为您没有提供这些名称。

images_controller

class ImagesController < ApplicationController
  def index
    @images = Image.all
  end
end

视图/图像/ index.html.erb

<% @images.each do |image| %>
   <%= image_tag image.picture.url %>
<% end %>

注意

  

这不是为了宣传产品

如果您需要查看包含源代码的示例,那么这是BitBucket repository,这是live Heroku appStripe test card number必须提供类似{{1}的CVC代码等等。

答案 1 :(得分:0)

第一步是集成图像上传,您可以利用许多库来实现这一目标。

您希望获取dotenv-rails gem,以便安全地管理AWS S3所需的凭据。这是生产就绪RoR应用程序的专用资源。

你想要的下一个宝石是carrierwave-awscarrierwave宝石,它将管理所有东西,以及迄今为止的三颗宝石。第四个也是最后一个宝石是mini_magick,这是使用carrierwave提供的方法的必要条件。

第二步是注册AWS账户以使用S3存储桶。您无法在应用程序上显示图像,因为如果这样做,您将无法使用图像部署到Heroku。 Heroku将摆脱它们。

一旦您安装了这些宝石,就可以运行bundle install,然后构建基本功能。

以下是有关carrierwave的一些文档:https://github.com/carrierwaveuploader/carrierwave

上述链接中的文档将指导您如何正确安装carrierwave

所以你会做类似的事情:

rails generate uploader Photo

photo_uploader.rb文件中,您要取消注释此代码:

def extension_whitelist
   %w(jpg jpeg gif png)
end

您希望此未注释充当您可以上传的文件类型的验证器。因此,如果它不是jpg jpeg gif png RoR会抛出错误。这个白名单很方便,所以我强烈推荐它。

接下来,您必须在上传器和数据库之间设置映射。

因此,快速转发到您需要将AWS连接到您的应用的部分。这就是你的dotenv-rails宝石进来的地方。顺便说一句,所有这些宝石都可以在rubygems.org找到。

在文件夹的根目录中,您将创建一个名为.env的文件。

.env文件中,您将添加以下内容:

S3_BUCKET_NAME=
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_REGION=

永远不要将AWS密钥推送到任何代码库版本控制工具,如Github。

您想要进入.gitignore文件并确保包含.env文件。这样git就不会跟踪该文件。

要获取您的AWS凭据,请在AWS控制台中输入您的姓名并单击它,您将看到一个下拉列表

  

我的安全凭据

作为选项。

接下来,创建您的存储桶。

要测试与RoR应用程序的成功集成,请转到rails console并运行以下命令:

ENV.fetch('S3_BUCKET_NAME')

如果您在此阶段收到错误,则可能需要转到config/application.rb并添加:

require "dotenv-rails"

完成后,请返回rails c然后再次运行ENV.fetch('S3_BUCKET_NAME'),如果您正确执行了这些步骤,您应该好好去。

您应该有一个initializers文件夹,并且在那里您将创建carrierwave.rb文件。

在该文件的内部,您将粘贴本文档的 Usage 部分下的所有代码:

https://github.com/sorentwo/carrierwave-aws

返回您的photo_uploader.rb文件,将storage :file更改为storage :aws

首页拉伸到这里,返回carrierwave.rb文件,您需要从上面的链接中复制和粘贴的内容中完全删除一行代码,这就是这一行:

config.asset_host = "http://example.com/

现在您可以启动rails server而不是指向您的本地文件系统,它现在应该指向您的存储桶。