【问题标题】:CarrierWave not uploading files to s3, but to cache (Sinatra app on Heroku)CarrierWave 不将文件上传到 s3,而是缓存(Heroku 上的 Sinatra 应用程序)
【发布时间】:2019-01-01 12:34:24
【问题描述】:

我有一个 Sinatra 应用程序,它接收图像并尝试将其上传到 s3。我收到的响应说模型已成功保存,但它在保存时返回的图像 URL 是缓存的上传。 s3 存储桶中也没有显示图像。代码如下,是不是有明显的错误?我正在关注Railscast #383 上传到 s3 的剧集。

感谢您的帮助,我尝试了很多方法都无济于事。

app.rb

    before do
        #Configure Carrierwave
        CarrierWave.configure do |config|
            config.storage = :fog

            config.fog_credentials = {
                provider: "AWS",
                aws_access_key_id: ENV['s3_access_key_id'],
                aws_secret_access_key: ENV['s3_secret_access_key']
            }

            config.fog_directory = ENV['s3_bucket']
            config.fog_public = true
        end
    end

    post "/nominations" do
        image = params[:file] || nil

        nomination = Nomination.create({
            image: image
        })

        if nomination.valid?
            nomination.save

            status 201
            body nomination.image.url
        else
            status 500
            body nomination.errors.messages.to_s.to_json
        end
    end
end

image_uploader.rb

require "carrierwave"
require 'carrierwave/storage/fog'

class ImageUploader < CarrierWave::Uploader::Base

  storage :fog

  def extension_white_list
    %w(jpg jpeg gif png)
  end
end

提名.rb

class Nomination < ActiveRecord::Base
    extend CarrierWave::Mount

    attr_accessor :image

    mount_uploader :image, ImageUploader
end

【问题讨论】:

  • 如果您将ruby 标签添加到此,您可能会获得更多观看次数,可能会代替amazon-web-services,因为amazon-s3 标签涵盖了这一点。

标签: ruby heroku amazon-s3 sinatra carrierwave


【解决方案1】:

我是直接通过s3上传的:

image = params[:file] || ''

uri = URI::Data.new(image)

filename = nom.id.to_s + "_" + Time.now.strftime('%Y%b%d_%H:%M:%S') + '.png'
s3 = Aws::S3::Client.new(
  access_key_id: ENV.fetch('s3_access_key_id'),
  secret_access_key: ENV.fetch('s3_secret_access_key'),
  region: ENV.fetch('s3_region'),
)
response = s3.put_object(bucket: ENV.fetch('s3_bucket'), key: filename, body: uri.data, acl: "public-read")

image = "https://s3.amazonaws.com/" + ENV.fetch('s3_bucket') + "/" + filename

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 2022-07-02
    • 2014-05-30
    • 1970-01-01
    • 2012-01-14
    • 2016-06-29
    • 2014-02-03
    相关资源
    最近更新 更多