图片未从 public/asset 上传到页面,导致 Rails 通过 Carrierwave 出现连接错误

Image is not uploading from public/asset to the page, giving connection error in Rails via Carrierwave

我在从本地作为 env=production 或在 heroku 中上传图像时遇到问题。我花了两天时间寻找解决方案,但我找不到任何解决方案。

当我想在生产模式下本地添加图像时,它出现在 public 文件夹中但无法使用。

我正在通过 'carrierwave' gem 上传图片。 我也下载了 'figaro' 和 'fog-aws'。 除了从本地上传用户头像图像外,一切正常。 您可以从这里查看我正在尝试完成的申请:https://young-atoll-50498.herokuapp.com/?locale=en *您应该先注册才能尝试上传图片。

这是我的头像上传器:

class AvatarUploader < CarrierWave::Uploader::Base
  storage :file
  storage :fog

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
    
  def default_url(*args)
  model.name ||= ''
  
  case 
  when ( model.name.empty? )           then ActionController::Base.helpers.asset_path("cat")
  when ( model.name[0].downcase < 'h') then ActionController::Base.helpers.asset_path("cat")
  when ( model.name[0].downcase < 'n') then ActionController::Base.helpers.asset_path("octahedron")
  when ( model.name[0].downcase < 'u') then ActionController::Base.helpers.asset_path("pyramid")
  else ActionController::Base.helpers.asset_path("happy_cone")
  end
 end
end

我的 user.rb

中有 mount_uploader
mount_uploader :avatar, AvatarUploader

这是用户控制器#update

def update
    respond_to do |format|
      if @user.update(edit_user_params)
            format.html { redirect_to @user, notice: 'User was successfully updated.' }
      else
        format.html { render :edit }
      end
    end
  end

private

def edit_user_params
  params.require(:user).permit(:email, :name, :avatar_url, :role, :avatar)
end

我在生产模式下遇到这个错误:

excon.error.response
  :body          => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>4ADD67E52EF3DB0B</RequestId><HostId>6AELpBiQhDEsHwWU2usKMrg0kvF5ZG/XqXhNLzteahK1Ajyqk1Irru35xAetrKKbmIlMsOjGEp0=</HostId></Error>"
  :cookies       => [
  ]
  :headers       => {
    "Connection"       => "close"
    "Content-Type"     => "application/xml"
    "Date"             => "Tue, 17 Nov 2020 15:06:44 GMT"
    "Server"           => "AmazonS3"
    "x-amz-id-2"       => "6AELpBiQhDEsHwWU2usKMrg0kvF5ZG/XqXhNLzteahK1Ajyqk1Irru35xAetrKKbmIlMsOjGEp0="
    "x-amz-request-id" => "4ADD67E52EF3DB0B"
  }
  :host          => "extensionschool-p4.s3.amazonaws.com"
  :local_address => "192.168.1.20"
  :local_port    => 57691
  :path          => "/uploads/user/avatar/1/ProfilePhoto.png"
  :port          => 443
  :reason_phrase => "Forbidden"
  :remote_ip     => "52.217.1.188"
  :status        => 403
  :status_line   => "HTTP/1.1 403 Forbidden\r\n"
):
F, [2020-11-17T16:06:45.498764 #19316] FATAL -- : [dae587c2-d7cd-41cd-b5b7-202052fcd4b1]   
F, [2020-11-17T16:06:45.498795 #19316] FATAL -- : [dae587c2-d7cd-41cd-b5b7-202052fcd4b1] app/controllers/users_controller.rb:38:in `block in update'
[dae587c2-d7cd-41cd-b5b7-202052fcd4b1] app/controllers/users_controller.rb:37:in `update'

我已经找到了问题,并想写下解决方案,以供将来可能遇到相同问题的人...

我按照以下文章的说明进行操作,因为我的课程推荐了一篇文章:https://blog.thefirehoseproject.com/posts/switching-carrierwave-to-use-s3-with-heroku-and-localhost/

*但这已经很老了!

我收到关于连接到 S3server 的错误。在安排“权限”时,在为 Amazon IAM 仪表板创建用户时,您应该首先创建三个 'off',最后一个 'on'。所以,你可以上传图片了。

阻止所有 public 访问 -> 关闭

  • 阻止 public 访问通过新访问控制列表 (ACL) 授予的存储桶和对象:关闭
  • 阻止 public 访问通过任何访问控制列表 (ACL) 授予的存储桶和对象:关闭
  • 阻止 public 访问通过新 public 存储桶或访问点策略授予的存储桶和对象:关闭
  • 通过任何 public 存储桶或访问点策略阻止 public 和跨账户访问存储桶和对象:开启

编码愉快!