Carrierwave和Amazon S3文件下载/上传

11

我有一个Rails 3应用程序,其中包含UploadsUploader和Resource模型。我最近切换到使用S3存储,这破坏了我使用send_to方法下载文件的能力。我可以使用redirect_to方法启用下载,该方法只是将用户转发到经过身份验证的S3 URL。我需要对文件下载进行身份验证,并且我希望URL为http://mydomainname.com/the_file_pathhttp://mydomainname.com/controller_action_name/id_of_resource,因此我假设我需要使用send_to,但是否有一种使用redirect_to方法实现此目的的方法?我的当前代码如下。Resources_controller.rb

def download
  resource = Resource.find(params[:id])
    if resource.shared_items.find_by_shared_with_id(current_user) or resource.user_id == current_user.id
        filename = resource.upload_identifier
        send_file "#{Rails.root}/my_bucket_name_here/uploads/#{filename}"
    else
        flash[:notice] = "You don't have permission to access this file."
        redirect_to resources_path
    end
end

carrierwave.rb初始化器:

CarrierWave.configure do |config|
  config.fog_credentials = {
    :provider               => 'AWS',       # required
    :aws_access_key_id      => 'xxxx',       # copied off the aws site
    :aws_secret_access_key  => 'xxxx',       # 
  }

  config.fog_directory  = 'my_bucket_name_here'                     # required
  config.fog_host       = 'https://localhost:3000'            # optional, defaults to nil
  config.fog_public     = false                                   # optional, defaults to true
  config.fog_attributes = {'Cache-Control'=>'max-age=315576000'}  # optional, defaults to {}
end

upload_uploader.rb

class UploadUploader < CarrierWave::Uploader::Base
  storage :fog

  def store_dir
    "uploads"
  end
end

所有的这些都会抛出错误:
无法读取文件/home/tom/Documents/ruby/rails/circlshare/My_bucket_name_here/uploads/Picture0024.jpg
我尝试了解carrierwave、fog、send_to等等,但到目前为止我尝试的一切都没有成果。上传正常工作,我可以在s3存储桶中看到文件。使用re_direct将是很好的选择,因为文件不会通过我的服务器。感谢任何帮助。谢谢。
1个回答

6

看起来你想上传到S3,但是没有公开的URL。与其从S3下载文件并使用send_file,不如将用户重定向到S3经过身份验证的URL。这个URL会过期,并且只有一小段时间有效(供用户下载)。

查看这个帖子:http://groups.google.com/group/carrierwave/browse_thread/thread/2f727c77864ac923

由于您已经将fog_public设置为false,所以在调用resource.upload_url时是否会得到一个经过身份验证(即签名)的URL。


我已经获得了一个经过身份验证的URL,并且redirect_to方法也起作用了。我可能需要告诉我的用户“右键保存”,否则他们的浏览器可能会在浏览器中打开图像,从而显示亚马逊的URL - 尽管从技术上讲这不是问题,但看起来有点业余。或者我是否可以将URL隐藏起来,使用户无法看到?感谢您的帮助。 - technix
@technix -- 这正是37signals在其Basecamp文件上传中所做的。我不会费心去实现右键保存,但这取决于你。 - Jesse Wolgamott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接