如何使用AWS S3在ROR中更新文件/图像?

时间:2016-07-03 10:41:51

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

我正在使用Ruby on Rails开发一个图像编辑应用程序,我想在AWS S3云存储上更新我的图像。 目前我有一个用户登录的系统,然后使用Carrierwave上传器在生产中使用雾上传S3上的图像, 然后我对控制器进行了AJAX调用,使用mini_magick gem触发编辑,最后重新加载图像。

问题是我不知道如何在S3上重新加载它(更新图像),在本地它工作正常,但问题是在Heroku上使用S3进行生产。

其中一个答案是这个,但对我来说它不起作用:(AWS :: S3 :: S3Object.store's3 / path / to / untitled.txt',params [:textarea_contents_params_name],your_bucket_name)。

这是我的代码:

def flip # controller
    imagesource = params["imagesource"].to_s # URL

    image = MiniMagick::Image.open("#{imagesource}")
    image.combine_options do |i|
      i.flip
    end
    # image.write "#{imagesource}" # development

    # production
    AWS::S3::Base.establish_connection!(
        :access_key_id     => 'xxxxxxxxxxxxxx',
        :secret_access_key => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    )
    AWS::S3::S3Object.store '#{imagesource}', image, 'mybucket'
    AWS::S3::S3Object.store('#{imagesource}', open(image), 'mybucket') #2nd attempt

    respond_to do |format|
      format.json {render :json => {:result => image}}
    end
end

1 个答案:

答案 0 :(得分:0)

在尝试将文件上传到磁盘之前,您需要将文件写入磁盘(就像在开发中一样)。您的代码应该显式地将数据写入临时位置(例如使用Tempfile),而不是让该位置由用户输入控制

如果评论建议用户输入是网址,则recent security updates可能会阻止您直接将网址传递给minimagick。如果是这样,首先下载图像(到临时文件),然后将其传递给minimagick。

看起来您正在使用aws-s3进行s3上传(超级旧版和维护版等)。如果是这样,则不完全清楚参数的值是什么,但是当您将图像上传到s3时,您可能只指定URL的路径部分。 store的第二个参数可以是IO对象(例如File的实例),也可以是包含实际数据的字符串。