【发布时间】:2019-01-23 17:26:13
【问题描述】:
我在尝试 GET 来自 S3 的图像时收到 Bad Request 400。我怀疑这可能是 ACL 问题,但我不知所措,因为我能够成功上传到 S3 并且我在 AWS 控制台中看到了图像文件。
index.html.erb
<%= image_tag url_for(post.photo) %>
生成此链接
http://localhost:3000/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBDQT09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--aeb32f210c13064270e52b720f34901fda2bd5a6/Kevin.jpg
导致GET 400 Bad Request
https://myapplication.s3.us-east-2.amazonaws.com/jEtGANzYnkc8FAZyV9pFWRtG?response-content-disposition=inline%3B%20filename%3D%22Kevin.jpg%22%3B%20filename%2A%3DUTF-8%27%27Kevin.jpg&response-content-type=image%2Fjpeg
日志显示了这一点
Started GET "/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBDQT09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--aeb32f210c13064270e52b720f34901fda2bd5a6/Kevin.jpg"
Processing by ActiveStorage::BlobsController#show as JPEG
Parameters: {"signed_id"=>"eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBDQT09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--aeb32f210c13064270e52b720f34901fda2bd5a6", "filename"=>"Kevin"}
ActiveStorage::Blob Load (2.5ms) SELECT "active_storage_blobs".* FROM "active_storage_blobs" WHERE "active_storage_blobs"."id" = $1 LIMIT $2 [["id", 3], ["LIMIT", 1]]
S3 Storage (1.5ms) Generated URL for file at key: jEtGANzYnkc8FAZyV9pFWRtG (https://myapplication.s3.amazonaws.com/jEtGANzYnkc8FAZyV9pFWRtG)
Redirected to https://myapplication.s3.amazonaws.com/jEtGANzYnkc8FAZyV9pFWRtG
Completed 302 Found in 10ms (ActiveRecord: 2.9ms)
post.rb
class Post < ApplicationRecord
belongs_to :user
has_one_attached :photo
end
storage.yml,区域为us-east-1
amazon:
service: S3
access_key_id: <%= Rails.application.credentials.aws[:access_key_id] %>
secret_access_key: <%= Rails.application.credentials.aws[:secret_access_key] %>
region: <%= Rails.application.credentials.aws[:region] %>
bucket: <%= Rails.application.credentials.aws[:bucket] %>
environments/development.rb
config.active_storage.service = :amazon
posts_controller.rb
def create
@post = current_user.posts.build(post_params)
if @post.save
flash[:notice] = 'Post has been saved!'
else
flash[:alert] = 'Unable to save'
end
redirect_to posts_path
end
private
def post_params
params.require(:post).permit(:content, :photo)
end
【问题讨论】:
-
日志是否告诉您失败的原因?
-
什么都跳出来
-
您应该考虑使用
Rails.application.credentials.aws.fetch(:access_key_id)。如果在服务器启动时未设置密钥(KeyError: key not found: :access_key_id),而不是让它以 nil 值启动并稍后静默失败,这将引发异常。对应用正常运行所需的任何配置值执行此操作。 -
这是一个很好的呼吁,但是密钥都是正确的,因为我能够成功上传到 S3。我可以验证图像是否出现在正确的存储桶中。
-
它使用
myapplication.s3.us-east-2.amazonaws.com子域是故意的吗?
标签: ruby-on-rails amazon-s3 rails-activestorage