我正在尝试为我的应用程序开发直接文件上传到S3。我正在关注github教程,所有内容都或多或少都可以,但在尝试进行后期处理时会收到错误消息。
我做了以下事情:
我有一个名为clip.rb的活动记录模型:
class Clip < ActiveRecord::Base
belongs_to :attachable, :polymorphic => true
mount_uploader :avatar, AvatarUploader
attr_accessible :id, :avatar, :name, :clipat_file_name, :attachable_id, :attachable_type, :clipat, :project_id, :user_id, :path, :parent_id,
def save_and_process_avatar(options = {})
if options[:now] or 1==1
self.remote_avatar_url = avatar.direct_fog_url(:with_path => true)
save
else
Resque.enqueue(AvatarProcessor, attributes)
end
end
然后我有一个上传者:avatar_uploader.rb
class AvatarUploader < CarrierWave::Uploader::Base
include CarrierWave::RMagick
include CarrierWaveDirect::Uploader
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}" #I removed /#{model.id} from the template because it creates an empty directory on the server. But If I put it back, the same problem remains
end
version :thumb do
process :resize_to_limit => [50, 50]
end
end
和头像控制器:
class AvatarsController < ApplicationController
def new
@uploader = Clip.new.avatar
@uploader.success_action_redirect = 'http://localhost:3000/clips'
end
end
最后我的clip_controller:
class ClipsController < ApplicationController
def index
if params[:key]
key=params[:key].split("/")
clip = Clip.new
clip.attachable_id = key[3]
clip.attachable_type = "Pmdocument"
clip.key = params[:key]
# clip.save
clip.save_and_process_avatar
end
@clips = Clip.where("avatar is not null")
respond_to do |format|
format.html # index.html.erb
format.json { render json: @clips.collect { |p| p.to_jq_upload }.to_json }
end
end
当我上传文件时,如果我只保存我的“剪辑”,一切正常。但是,如果我使用save_and_process方法,则会出现错误: self.remote_avatar_url = avatar.direct_fog_url(:with_path =&gt; true)
这是错误消息:
OpenURI::HTTPError (403 Forbidden):
app/models/clip.rb:38:in `save_and_process_avatar'
app/controllers/clips_controller.rb:22:in `index'
Rendered /Users/nico/.rvm/gems/ruby-1.9.2-p290/gems/actionpack-3.1.3/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.4ms)
Rendered /Users/nico/.rvm/gems/ruby-1.9.2-p290/gems/actionpack-3.1.3/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.2ms)
Rendered /Users/nico/.rvm/gems/ruby-1.9.2-p290/gems/actionpack-3.1.3/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (5.2ms)
我已经挂了两天所以,任何帮助都将不胜感激!!!谢谢!!!尼古拉斯。
答案 0 :(得分:2)
我敢打赌,提供给self.remote_avatar_url
的网址不正确。我有同样的问题,CWDirect gem提供的代码对我不起作用并给了我一个不正确的URL,因此CarrierWave无法下载和处理图像。整个403 Forbidden错误消息是来自亚马逊的垃圾消息 - 这导致人们相信权限有问题;在我的情况下,权限绝对没有错。只是那里没有图像。以下代码使我能够工作,注意我已经改变了URL的形成方式:
def save_and_process_image(options = {})
if options[:now]
# debugger
self.remote_image_url = image.direct_fog_url+self.key # OLD CODE THAT AINT WORKIN! --> image.direct_fog_url(:with_path => true)
save
else
# Resque.enqueue(AvatarProcessor, attributes)
# TODO: Implement background processing
end
end
请注意,我的已装载字段的名称为image
,而不是avatar
。
我如何解决这个问题并修复它 - 试试这个,使用rails调试器(只需取消注释上面的调试器行)就可以在self.remote_image_url
行之前冻结程序,然后在调试模式下irb
启动控制台。然后你可以打印出来,看看'image.direct_fog_url(:with_path =&gt; true)'给你的价值。您可以将其复制并粘贴到浏览器中。如果它是错的(可能是)那么你将得到愚蠢的权限错误(即使它不是权限问题),但是当它正确时你会看到上传的图像或图像将下载。
最好让您的Amazon S3控制台打开并查看您的开发桶,以便找到刚刚上传的图像。在控制台中查找图像并转到其属性,您可以看到所谓的要使用的网址/网址。
希望这会有所帮助。由于误导性的错误,我很难找到,我花了很多时间试图纠正我的S3存储桶的权限,但这不是问题,只是来自CWDirect github页面的代码对我不起作用(宝石版??)。