簡體   English   中英

如何使用回形針從s3訪問同一Ruby on Rails應用程序中的私人和公共圖像

[英]How to access private and public images in the same Ruby on Rails app from s3 using paperclip

應用程序

我正在編寫一個需要從用戶那里獲取圖片並將其保存在AWS S3存儲桶中的應用程序。

app / models / picture.rb

class Picture < ActiveRecord::Base

  include Paperclip::Glue

  belongs_to :user

  scope :active_objects, -> { where(is_deleted: false)}

  has_attached_file :image,

  :styles => {:medium => "800>", :small => "480>", :thumb => "100>"},
  :convert_options => {:medium =>'-quality 90', :small =>'-quality 80', :thumb => '-quality 50' },
  :storage => :s3,
  :url => ":s3_domain_url",
  :path => 'pictures/:id/image/:style/:basename.:extension',
  # :s3_permissions => :private,
  :s3_region => 's3-ap-southeast-1.amazonaws.com',
  :s3_endpoint => 's3-ap-southeast-1.amazonaws.com',
  :s3_credentials => Proc.new { |a| a.instance.s3_credentials }

  def s3_credentials
    {:bucket => App.secrets.bucket_name, :access_key_id => App.secrets.aws_access_key_id, 
      :secret_access_key => App.secrets.aws_secret_access_key}
  end

  def url(style_name = :original, time = 30.minutes.to_i)
    image.s3_permissions == :private ? (image.expiring_url(time, style_name)) : (image.url(style_name))
  end

end

問題

如您所見,我已經將s3_permissions設置為true,並且為了訪問那些圖片使用了expiring_url方法。 現在,我想將圖片公開,所以我評論了s3_permissions。

上傳新圖片后,無需使用expiring_url方法就可以訪問圖片

>> Picture.last.url

並且響應中的url在“瀏覽器”選項卡中打開了一個圖像,但是仍然無法訪問之前上傳的圖像(Picture.first)。 當我嘗試打開網址時,它給了我這個

<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>6423906A78A3FDFF</RequestId>
<HostId>
fowfNEi6+mM265iGig+jhT1/ih2P7yhPzNegHiS9Q6NrP4mnGNKkXFDefLva85tjAQ0uNbenYew=
</HostId>
</Error>

同樣,它們的s3_permissions作為public_read來。

>> Picture.first.image.s3_permissions
A, [2018-05-01T01:18:05.171381 #94266]   ANY -- : 2018-05-01 01:18:05 +0530 severity=DEBUG, Picture Load (0.7ms)  SELECT  "pictures".* FROM "pictures" ORDER BY "pictures"."id" ASC LIMIT $1  [["LIMIT", 1]]
=> :public_read

您必須在S3端配置此訪問權限。

將其放入您的存儲桶策略中:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::your_bucket_name/*"
        }
    ]
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM