【问题标题】:rails uploading file to Amazon S3rails 将文件上传到 Amazon S3
【发布时间】:2016-03-14 16:29:57
【问题描述】:

我想将文件从我的 Rails 应用程序直接上传到 AmazonS3。配置现在看起来像这样:

宝石文件

宝石“回形针”

gem 'aws-sdk'

在 config/application.rb 中

# Amazon S3 configuration for paperclip
config.paperclip_defaults = {
    :storage => :s3,
    :s3_host_name => 's3-eu-west-1.amazonaws.com'
}

模型 - movie.rb

class Movie < ActiveRecord::Base

   # add File to Movie association on column mo
   has_attached_file :movie,
                :storage => :s3,
                :bucket => '--',
                :s3_credentials => {
                    :bucket => '---',
                    :access_key_id => '---',
                    :secret_access_key => '---'
                }

  # validdates the file type
  validates_attachment_content_type :movie, :content_type => /\Avideo\/.*\Z/

end

控制器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)
      @movie = Movie.new(params[:movie])
      if @movie.save
        flash[:notice] = t("flash.moveuploadstarted")
        redirect_to :addMovie
      end
    else
      @movie = Movie.new
    end
  end


  private

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

end

数据库如下所示:

当我填写表格并发送电影时,浏览器开始上传电影,左下角会显示视频。但是当达到 100% 时,电影不会存储到 Amazon S3 并且数据库是空的,但没有错误左右....

可能是什么问题? .

更新:

上传表单有这个视频的输入文件

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

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 amazon-web-services amazon-s3


    【解决方案1】:

    这是使用carrierwave的代码,但对于paperpclip应该是相同的(顺便说一句,carrierwave是标准并且推荐)

    注意它应该在配置初始化文件中

    config/initializers/carrier_wave.rb
    
    if Rails.env.production?
      CarrierWave.configure do |config|
        config.fog_credentials = {
          # Configuration for Amazon S3
          :provider              => 'AWS',
          :aws_access_key_id     => ENV['S3_ACCESS_KEY'],
          :aws_secret_access_key => ENV['S3_SECRET_KEY']
        }
        config.fog_directory     =  ENV['S3_BUCKET']
      end
    end
    

    【讨论】:

    【解决方案2】:

    对于傻笑,您可以尝试在 application.rb 文件中输入存储桶名称、访问密钥和密钥吗?我想知道存储桶和其他信息是否需要在配置文件中

    【讨论】:

      【解决方案3】:

      您是否尝试将 params[:movie] 打印到控制台?

      puts params[:movie]
      

      看起来您是从参数中获取电影哈希,而不是从该哈希内的字段中获取值。我建议您使用字段名称来保存视频文件,例如 movie_video。

       class Movie < ActiveRecord::Base
      
             # add File to Movie association on column mo
             has_attached_file :movie_video,
                          :storage => :s3,
                          :bucket => '--',
                          :s3_credentials => {
                              :bucket => '---',
                              :access_key_id => '---',
                              :secret_access_key => '---'
                          }
      
            # validdates the file type
            validates_attachment_content_type :movie_video, :content_type => /\Avideo\/.*\Z/
      
      end
      

      【讨论】:

      • 上面添加了file_input
      • 你试过输出控制器中的参数吗?通常,rails 控制器动作期望处理一个散列,该散列基本上表示相应模型的一个实例,在这种情况下,您的电影模型由 :movie 散列表示,并且 MovieController 中的动作作用于该电影。因为您的模型中没有名为 :movie 的字段,所以该值不能写在我想说的任何地方。
      • 现在用carrierwave试过了..但同样的问题......什么也没做:stackoverflow.com/questions/35983943/…
      • 您可以在日志中找到有关服务器上发生的情况的有用信息。还有this answer may help you.
      • 不支持您提供的授权机制。请使用 AWS4-HMAC-SHA256。我该怎么办
      猜你喜欢
      • 1970-01-01
      • 2019-12-10
      • 2013-09-09
      • 2015-10-28
      • 1970-01-01
      • 2016-06-29
      • 2018-08-20
      • 2011-07-21
      • 2014-05-01
      相关资源
      最近更新 更多