Rails 使用载波和雾将文件上传到 Amazon S3

Rails upload files to Amazon S3 with carrierwave and fog

我尝试将电影文件从我的 rails 应用程序上传到 Amazon S3。首先我尝试了回形针,但它不起作用......

不,我尝试了 carrierwave + fog,但结果相同,但没有任何效果,没有文件存储在 S3 中,没有数据库条目,也没有错误...

我的文件如下所示:

app/uploader/movie_uploader.rb

class MovieUploader < CarrierWave::Uploader::Base
   storage :fog
   def store_dir
         "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
   end
 end

config/initializers/carrierwave.rb

CarrierWave.configure do |config|
  config.fog_credentials = {
      provider:               'AWS',
      aws_access_key_id:      '--',
      aws_secret_access_key:  '--',
      region:                 'eu-central-1'
  }

  config.fog_directory    = 'movies'
end

app/models/movie.rb

class Movie < ActiveRecord::Base
   mount_uploader :movie, MovieUploader
end

app/controller/movies_controller.rb

class MoviesController < ActionController::Base
  layout "application"

   # Method to add a new Movie
   def addMovie
   if request.post?
      @movie = Movie.new(movies_params)
        if @movie.save
          redirect_to :addMovie
       end
    else
      @movie = Movie.new
    end
   end

  private
  def movies_params
     params.require(:movie).permit(:movietitle, :movieprice, :locked, :moviedescription, :currency, :language, :movie)
  end
end

上传表格

普通多部分form_tag

    <%= form_for Movie.new, :html => {:multipart => true, :class => "form-horizontal", :role => "form"}, :method => :post, :url => {} do |f| %>

带文件字段

    <div class="form-group">
      <label><%= f.label :movie %></label>
      <%= f.file_field :movie, :class => "form-control", :placeholder => :movie %>
    </div>

我使用了这个教程:https://u.osu.edu/hasnan.1/2014/03/13/rails-4-upload-image-to-s3-using-fog-and-carrierwave/

怎么了?

我遇到了同样的问题。这解决了我的问题。

在 MovieUploader 中

class MovieUploader < CarrierWave::Uploader::Base
   # Include RMagick or MiniMagick support:
   include CarrierWave::MiniMagick

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

在config/carrierwave.rb

if Rails.env.development? or Rails.env.test?
  CarrierWave.configure do |config|
    config.storage = :file
    config.enable_processing = false
  end

else
  CarrierWave.configure do |config|
    config.fog_credentials = {
      :provider               => 'AWS',            # required
      :aws_access_key_id      => 'ACCESS KEY',     # required
      :aws_secret_access_key  => 'ACCESS SECRET',  # required
      :region                 => 'eu-central-1'
    }
    config.fog_use_ssl_for_aws = false
    config.storage             = :fog
    config.fog_directory       = 'movies'          # required
  end
end

希望对您有所帮助。