【问题标题】:Can't Upload File throught Rails Docker, Carrierwave to AWS S3无法通过 Rails Docker、Carrierwave 将文件上传到 AWS S3
【发布时间】:2018-07-09 13:22:03
【问题描述】:

我在 Docker 下运行的 RAILS 中有一个应用程序,我希望它使用 Gem Carrierwave 将文档上传到 S3 存储桶

当我上传文件时,一切似乎都很好,但文件从未出现在我的存储桶中。

我错过了什么吗?也许是权限或开放端口?

我的配置是一样的:

aws.rb

require 'aws-sdk'

Aws.config.update({
  region: ENV['aws_region'],
  credentials: Aws::Credentials.new(ENV['aws_access_key_id'],ENV['aws_secret_access_key'])
})

carrierwave.rb

CarrierWave.configure do |config|
  config.storage      = :aws
  config.aws_bucket   = ENV['aws_bucket']
  config.aws_acl      = 'public-read'


  config.aws_authenticated_url_expiration = 60 * 60 * 24 * 7
  config.aws_attributes = {
    expires: 1.week.from_now.httpdate,
    cache_control: 'max-age=604800'
  }

  config.aws_credentials = {
    :region             => ENV['aws_region'],
    :force_path_style   => true,
    :signature_version  => 'v4',
    :credentials        => Aws::Credentials.new(ENV['aws_access_key_id'],ENV['aws_secret_access_key']),
  }

end

docker-compose.yml

appsnginx:
    build:
      context: .
      dockerfile: Dockerfile-nginx
    volumes:
      - ./log:/apps/log
    ports:
      - "3000:80"
      - "8443:443"
    depends_on:
      - apps
apps:
    build: .
    command: puma -C config/puma.rb
    volumes:
        - .:/apps
        - ./tmp/uploads-cache:/apps/tmp/uploads
    expose:
        - "3000"

document_uploader.rb

class DocumentUploader < CarrierWave::Uploader::Base

  storage :aws

  def store_dir
    "#{Rails.env}/#{model.class.to_s.underscore}/#{mounted_as}"
  end

  def default_url
    "https://placehold.it/1920X1280"
  end


  def cache_dir
    "#{Rails.root}/tmp/uploads-cache"
  end


  def extension_whitelist
    %w(pdf doc htm html docx txt jpg jpeg png)
  end

  def filename
    "#{File.basename(file.filename,".*")}__#{secure_token}.#{file.extension}" if original_filename.present?
  end

  protected
  def secure_token
    var = :"@#{mounted_as}_secure_token"
    model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid)
  end

end

【问题讨论】:

    标签: ruby-on-rails docker amazon-s3 docker-compose carrierwave


    【解决方案1】:

    首先: 我向自己保证,“cache_dir”文件夹是可访问的,并设置为我的系统和我的 docker 之间的共享卷 我向自己保证,我的 AWS Bucket 文件夹已创建并可从公众访问

    问题似乎来自我的“DocumentUploader”的“secure_token”和“filename”方法

    我不得不改变这个

    "#{File.basename(file.filename,".*")}__#{secure_token}.#{file.extension}" if original_filename.present?
    

    通过

    "#{File.basename(original_filename,".*")}__#{secure_token}.#{file.extension}" if original_filename.present?
    

    错误消息是

    无法修改冻结的 NilClass model.instance_variable_get(var) 或 model.instance_variable_set(var, SecureRandom.uuid)

    我很难找到它,因为它基本上是无声的。它没有出现在任何日志、输出或屏幕中。当我到处都留下痕迹时,我会在它上面留茬;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      相关资源
      最近更新 更多