Позвольте мне сказать, что у меня загружена загрузка изображений AWS S3 и Paperclip. Файл справочного журнала ниже.Rails AWS S3 с Paperclip «не удалось загрузить ресурс: сервер ответил 403 запрещен»
Я потратил слишком много часов, пытаясь отследить проблему с помощью метода Get Method, возвращающего 403, с тем, что похоже на то, что Get добавляет расширение в конце имени файла.
Я подтвердил, что я могу подключиться к изображениям, хранящимся в моем ковше, путем жесткого кодирования источника html непосредственно в представлении, например, http://mybucket_name.s3.amazonaws.com/..../filename. Изображение отображается в порядке.
Вот код настройки:
Я использую paperclip.rb
# config/initializers/paperclip.rb
Paperclip::Attachment.default_options[:url] = ':s3_domain_url'
Paperclip::Attachment.default_options[:path] = '/:class/:attachment/:id_partition/:style/:filename'
Я использую aws.yml (используя AWS-SDK)
#config/aws.yml
development:
access_key_id: xxxxxx
secret_access_key: xxxxxxxxxxxxxxxxx
production:
access_key_id: xxxxxx
secret_access_key: xxxxxxxxxxxxxxxx
В моей среды:
.....
#config/environments/development.rb
# Path to ImageMagick
Paperclip.options[:command_path] = "/ImageMagick"
config.paperclip_defaults = {
:storage => :s3,
:s3_credentials => {
:bucket => 'mybucket_name'
}
}
....
Я не делаю ничего особенного в моей модели профиля. Вот то, что я использую для скрепкой:
....
#paperclip image attachment
has_attached_file :logo_image, :styles => { :medium => "250x250>", :small => "175x175>",
:thumb => "100x100>" }
# Validate content type
validates_attachment_content_type :logo_image, :content_type => /\Aimage/
# Validate filename
validates_attachment_file_name :logo_image, :matches => [/png\Z/, /jpe?g\Z/, /JPG?\Z/]
validates_attachment_size :logo_image, :less_than => 4.megabytes
....
Профиль контроллера
#profiles_controller.rb
....
def create
@profile = Profile.new(profile_params)
if @profile.save
flash[:notice] = "Profile has been created."
redirect_to @profile
else
flash[:alert] = "Profile has not been created."
render "new"
end
end
def edit
end
def update
if @profile.update(profile_params)
redirect_to @profile
flash[:notice] = "Profile has been updated."
else
flash[:alert] = "Profile has not been updated."
render "edit"
end
end
def destroy
@profile.destroy
flash[:notice] = "Profile has been destroyed."
redirect_to profiles_path
end
private
def profile_params
params.require(:profile).permit(:id, :firstname, :lastname, :instagram, :company, :website,
:street_address, :city, :state, :zipcode, :phone, :logo_image, :address, :latitude,
:longitude,
:user_id, :user_email_id)
end
def set_profile
@profile = Profile.find(params[:id])
rescue ActiveRecord::RecordNotFound
flash[:alert] = "The profile you were looking for could not be found."
redirect_to profiles_path
end
пользователя Модель (Я Builing в profile_id через User Model)
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable, :confirmable
has_one :profile, :dependent => :destroy, autosave: true
accepts_nested_attributes_for :profile
after_create :build_profile
has_many :tags
def build_profile
Profile.create(user: self)
end
end
Форма выпуска (шифр -out: я не использую multipart => "true")
....
<%= form_for @profile, :html => {"data-ajax" => false} do |f| %>
<p> </p>
[form code here ]
<div class="row">
<div class="col-md-4">
<%= f.file_field :logo_image %>
</div>
</div>
<p> </p>
<div class="row">
<div class="col-md-6">
<%= f.submit 'Save', :class =>
'btn btn-primary' %> <%= link_to "Cancel", :back, :class => 'btn btn-info' %>
View для отображения изображения:
....
<div data-role="navbar">
<ul>
<li ><%= link_to "Offers", profile_path(@profile = current_user.profile), :data => {:icon=>"star"}
%></li>
<li><a href="/tags" data-icon="tag">Tags</a></li>
<li><%= link_to(edit_profile_path(@profile = current_user.profile)) do %>
<%= image_tag current_user.profile.logo_image.url, :class => "img-circle" %><br>
<%= "Account" %>
<% end %>
</li>
</ul>
</div>
Вот лог-файл при обновлении изображения. Как вы можете видеть AWS & Скрепка, похоже, делает то, что они должны делать для удаления старого изображения и сохранения нового изображения. Все, кажется, работает нормально:
#log file
....
Started PATCH "/profiles/1" for 127.0.0.1 at 2014-11-09 17:59:11 -0800
Processing by ProfilesController#update as HTML
Parameters: {"utf8"=>"✓",
"authenticity_token"=>"XJiJcWbhLmeu0eJD1nvVPIDhQGRE4KhdJUlPnpY8HOo=", "profile"=>
{"firstname"=>"Jen", "lastname"=>"", "company"=>"", "website"=>"", "city"=>"", "state"=>"",
"phone"=>"", "address"=>", , , ", "latitude"=>"", "longitude"=>"", "logo_image"=>#
<ActionDispatch::Http::UploadedFile:0x511bfc0 @tempfile=#<File:C:/Users/Tom/AppData/Local
/Temp/RackMultipart20141109-12208-1wc9lj4>, @original_filename="PresidioPizza_405.jpg",
@content_type="image/jpeg", @headers="Content-Disposition: form-data;
name=\"profile[logo_image]\"; filename=\"PresidioPizza_405.jpg\"\r\nContent-Type: image/jpeg\r
\n">}, "commit"=>"Save", "id"=>"1"}
[1m[35mProfile Load (1.0ms)[0m SELECT "profiles".* FROM "profiles" WHERE
"profiles"."id" = $1 LIMIT 1 [["id", 1]]
[1m[36m (0.0ms)[0m [1mBEGIN[0m
[AWS S3 200 0.505819 0 retries]
head_object(:bucket_name=>"phototagapp",:key=>"profiles/logo_images/000/000/001/original
/selfie.jpg")
[AWS S3 200 0.124335 0 retries]
head_object(:bucket_name=>"phototagapp",:key=>"profiles/logo_images/000/000/001/medium
/selfie.jpg")
[AWS S3 200 0.118807 0 retries]
head_object(:bucket_name=>"phototagapp",:key=>"profiles/logo_images/000/000/001/small
/selfie.jpg")
[AWS S3 200 0.109592 0 retries]
head_object(:bucket_name=>"phototagapp",:key=>"profiles/logo_images/000/000/001/thumb
/selfie.jpg")
Command :: file -b --mime "C:/Users/Tom/AppData/Local
/Temp/682835cfecae2078ad6fa4af85a84f1420141109-12208-1nguzb2.jpg"
Command :: identify -format '%wx%h,%[exif:orientation]' "C:/Users/Tom/AppData/Local
/Temp/682835cfecae2078ad6fa4af85a84f1420141109-12208-192uk20.jpg[0]" 2>NUL
Command :: identify -format %m "C:/Users/Tom/AppData/Local
/Temp/682835cfecae2078ad6fa4af85a84f1420141109-12208-192uk20.jpg[0]"
Command :: convert "C:/Users/Tom/AppData/Local
/Temp/682835cfecae2078ad6fa4af85a84f1420141109-12208-192uk20.jpg[0]" -auto-orient -resize
"250x250>" "C:/Users/Tom/AppData/Local
/Temp/682835cfecae2078ad6fa4af85a84f1420141109-12208-192uk2020141109-12208-14j5z1t"
Command :: file -b --mime "C:/Users/Tom/AppData/Local
/Temp/682835cfecae2078ad6fa4af85a84f1420141109-12208-192uk2020141109-12208-14j5z1t"
Command :: identify -format '%wx%h,%[exif:orientation]' "C:/Users/Tom/AppData/Local
/Temp/682835cfecae2078ad6fa4af85a84f1420141109-12208-192uk20.jpg[0]" 2>NUL
Command :: identify -format %m "C:/Users/Tom/AppData/Local
/Temp/682835cfecae2078ad6fa4af85a84f1420141109-12208-192uk20.jpg[0]"
Command :: convert "C:/Users/Tom/AppData/Local
/Temp/682835cfecae2078ad6fa4af85a84f1420141109-12208-192uk20.jpg[0]" -auto-orient -resize
"175x175>" "C:/Users/Tom/AppData/Local
/Temp/682835cfecae2078ad6fa4af85a84f1420141109-12208-192uk2020141109-12208-1rsywau"
Command :: file -b --mime "C:/Users/Tom/AppData/Local
/Temp/682835cfecae2078ad6fa4af85a84f1420141109-12208-192uk2020141109-12208-1rsywau"
Command :: identify -format '%wx%h,%[exif:orientation]' "C:/Users/Tom/AppData/Local
/Temp/682835cfecae2078ad6fa4af85a84f1420141109-12208-192uk20.jpg[0]" 2>NUL
Command :: identify -format %m "C:/Users/Tom/AppData/Local
/Temp/682835cfecae2078ad6fa4af85a84f1420141109-12208-192uk20.jpg[0]"
Command :: convert "C:/Users/Tom/AppData/Local
/Temp/682835cfecae2078ad6fa4af85a84f1420141109-12208-192uk20.jpg[0]" -auto-orient -resize
"100x100>" "C:/Users/Tom/AppData/Local
/Temp/682835cfecae2078ad6fa4af85a84f1420141109-12208-192uk2020141109-12208-16e15ym"
Command :: file -b --mime "C:/Users/Tom/AppData/Local
/Temp/682835cfecae2078ad6fa4af85a84f1420141109-12208-192uk2020141109-12208-16e15ym"
Command :: file -b --mime "C:/Users/Tom/AppData/Local
/Temp/682835cfecae2078ad6fa4af85a84f1420141109-12208-1tjtjm4.jpg"
[1m[35mSQL (1.0ms)[0m UPDATE "profiles" SET "logo_image_file_name" = $1,
"logo_image_file_size" = $2, "logo_image_updated_at" = $3 WHERE "profiles"."id" = 1
[["logo_image_file_name", "PresidioPizza_405.jpg"], ["logo_image_file_size", 34800],
["logo_image_updated_at", "2014-11-10 01:59:12.534650"]]
[paperclip] deleting /profiles/logo_images/000/000/001/original/selfie.jpg
[AWS S3 204 0.113216 0 retries]
delete_object(:bucket_name=>"phototagapp",:key=>"profiles/logo_images/000/000/001/original
/selfie.jpg")
[paperclip] deleting /profiles/logo_images/000/000/001/medium/selfie.jpg
[AWS S3 204 0.113074 0 retries]
delete_object(:bucket_name=>"phototagapp",:key=>"profiles/logo_images/000/000/001/medium
/selfie.jpg")
[paperclip] deleting /profiles/logo_images/000/000/001/small/selfie.jpg
[AWS S3 204 0.108656 0 retries]
delete_object(:bucket_name=>"phototagapp",:key=>"profiles/logo_images/000/000/001/small
/selfie.jpg")
[paperclip] deleting /profiles/logo_images/000/000/001/thumb/selfie.jpg
[AWS S3 204 0.106705 0 retries]
delete_object(:bucket_name=>"phototagapp",:key=>"profiles/logo_images/000/000/001/thumb
/selfie.jpg")
[paperclip] saving /profiles/logo_images/000/000/001/original/PresidioPizza_405.jpg
[AWS S3 200 0.335884 0 retries]
put_object(:acl=>:public_read,:bucket_name=>"phototagapp",:content_length=>34800,
:content_type=>"image/jpeg",:data=>Paperclip::UploadedFileAdapter:
PresidioPizza_405.jpg,:key=>"profiles/logo_images/000/000/001/original/PresidioPizza_405.jpg")
[paperclip] saving /profiles/logo_images/000/000/001/medium/PresidioPizza_405.jpg
[AWS S3 200 0.140086 0 retries]
put_object(:acl=>:public_read,:bucket_name=>"phototagapp",:content_length=>19933,
:content_type=>"image/jpeg",:data=>Paperclip::FileAdapter:
682835cfecae2078ad6fa4af85a84f1420141109-12208-192uk2020141109-12208-14j5z1t,
:key=>"profiles/logo_images/000/000/001/medium/PresidioPizza_405.jpg")
[paperclip] saving /profiles/logo_images/000/000/001/small/PresidioPizza_405.jpg
[AWS S3 200 0.142438 0 retries]
put_object(:acl=>:public_read,:bucket_name=>"phototagapp",:content_length=>11679,
:content_type=>"image/jpeg",:data=>Paperclip::FileAdapter:
682835cfecae2078ad6fa4af85a84f1420141109-12208-192uk2020141109-12208-1rsywau,
:key=>"profiles/logo_images/000/000/001/small/PresidioPizza_405.jpg")
[paperclip] saving /profiles/logo_images/000/000/001/thumb/PresidioPizza_405.jpg
[AWS S3 200 0.222046 0 retries]
put_object(:acl=>:public_read,:bucket_name=>"phototagapp",:content_length=>5067,
:content_type=>"image/jpeg",:data=>Paperclip::FileAdapter:
682835cfecae2078ad6fa4af85a84f1420141109-12208-192uk2020141109-12208-16e15ym,
:key=>"profiles/logo_images/000/000/001/thumb/PresidioPizza_405.jpg")
[1m[36m (2.0ms)[0m [1mCOMMIT[0m
Redirected to http://localhost:3000/profiles/1
Completed 302 Found in 3560ms (ActiveRecord: 4.0ms)
Started GET "/profiles/1" for 127.0.0.1 at 2014-11-09 17:59:14 -0800
Processing by ProfilesController#show as HTML
Parameters: {"id"=>"1"}
[1m[35mProfile Load (1.0ms)[0m SELECT "profiles".* FROM "profiles" WHERE
"profiles"."id" = $1 LIMIT 1 [["id", 1]]
[1m[36mProfile Load (1.0ms)[0m [1mSELECT "profiles".* FROM "profiles"[0m
[1m[35mOffer Load (1.0ms)[0m SELECT "offers".* FROM "offers" WHERE
"offers"."offer_status" = 'On'
Rendered profiles/show.html.erb within layouts/application (2.0ms)
[1m[36mUser Load (1.0ms)[0m [1mSELECT "users".* FROM "users" WHERE "users"."id" = 1
ORDER BY "users"."id" ASC LIMIT 1[0m
[1m[35mProfile Load (0.0ms)[0m SELECT "profiles".* FROM "profiles" WHERE
"profiles"."user_id" = $1 LIMIT 1 [["user_id", 1]]
Completed 200 OK in 447ms (Views: 438.6ms | ActiveRecord: 4.0ms)
Вот что вид отображает:
<img alt="Presidiopizza 405" class="img-circle" src="http://phototagapp.s3.amazonaws.com
/profiles/logo_images/000/000/001/original/PresidioPizza_405.jpg%3F1415584752" />
Проблема, кажется,% 3F1415584752 быть присоединено к имени файла. Я протестировал AWS S3 БЕЗ Скрепки, но вместо этого использовал S3_Direct_Post, и изображения отображались правильно, без каких-либо странных расширений и с использованием той же установки/учетных данных AWS S3. Тем не менее, я бы хотел использовать paperclip. Надеюсь, кто-то может указать мне на исправление. Я предполагаю, что это может быть что-то глупое.
Когда я обращаюсь к консоли управления AWS S3, изображения сохраняются правильно в правильной структуре папок и имени файла.
Вот установка CORS.
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
<AllowedOrigin>http://localhost:3000</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedMethod>POST</AllowedMethod>
<AllowedMethod>PUT</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
Спасибо
спасибо. к сожалению, я до сих пор получаю% 3F1415584752 в конце моего источника url изображения. Любые идеи, почему он добавляет дополнительные данные? – tomc0920
Я тоже начал эту проблему после безупречной работы Paperclip/AWS в течение нескольких месяцев. Не уверен, что я изменил, чтобы вызвать эту проблему. –