2014-11-10 3 views
0

AWS S3 및 Paperclip 이미지 업로드가 정상적으로 작동한다고 말하면서 시작하겠습니다. 아래의 로그 파일을 참조하십시오.Rails AWS S3 with Paperclip "리소스를로드하지 못했습니다. 서버가 403으로 응답했습니다."

파일 이름 끝에 확장명을 추가해야하는 이유 때문에 Get Method가 403 forbidden을 반환하여 문제를 추적하는 데 너무 많은 시간을 소비했습니다.

보기에서 직접 HTML 소스를 하드 코딩하여 내 버킷에 저장된 이미지와 연결할 수 있음을 확인했습니다 (예 : http://mybucket_name.s3.amazonaws.com/..../filename). 이미지가 잘 표시됩니다. 여기

코드 설정이다 : 나는 paperclip.rb에게 내가 aws.yml을 사용하고

# config/initializers/paperclip.rb 
Paperclip::Attachment.default_options[:url] = ':s3_domain_url' 
Paperclip::Attachment.default_options[:path] = '/:class/:attachment/:id_partition/:style/:filename' 

을 사용하고

(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' 
    } 
} 

.... 

내 프로필 모델에서 특별한 일을하지 않습니다.

#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 

사용자 모델 (I은 사용자 모델을 통해 PROFILE_ID를 builing하고)

.... 
#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 

.... 

프로필 컨트롤러

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 : 다중 사용 => "true")

.... 

    <%= form_for @profile, :html => {"data-ajax" => false} do |f| %> 
              <p>&nbsp;</p> 

              [form code here ] 

              <div class="row"> 
               <div class="col-md-4"> 
                <%= f.file_field :logo_image %> 

               </div> 
              </div> 

              <p>&nbsp;</p> 
              <div class="row"> 
              <div class="col-md-6"> 
               <%= f.submit 'Save', :class => 
'btn btn-primary' %>&nbsp;&nbsp;<%= link_to "Cancel", :back, :class => 'btn btn-info' %> 

보기 이미지를 표시합니다 :

여기
.... 
<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 & 종이 클립은 이전 이미지를 삭제하고 새 이미지를 저장하기 위해해야 ​​할 일을하는 것처럼 보입니다. 모두 잘 동작하는 것 :

<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 것 같다 :

여기
#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) 

가보기 표시 것입니다. Paper Clip없이 AWS S3를 테스트했지만 대신 S3_Direct_Post와 이미지를 사용하여 이상한 확장 기능과 동일한 AWS S3 설정/자격 증명을 사용하여 올바르게 표시합니다. 그러나 저는 클립을 사용하고 싶습니다. 누군가가 그 문제를 지적 할 수 있길 바란다. 어리석은 짓일지도 모릅니다.

AWS S3 관리 콘솔에 액세스하면 이미지가 올바른 폴더 구조 및 파일 이름 내에 올바르게 저장됩니다.

다음은 CORS 설정입니다.

paperclip.rb 이니셜 :

Paperclip::Attachment.default_options.merge!(
    ... 
    use_timestamp: false, 
    ...) 

확인

<?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> 

내가 다음을 수행하여이 문제를 해결 믿는 당신이

답변

0

has_attached_file :image, 
     :logo_image, 
     :styles => { :medium => "250x250>", :small => "175x175>", :thumb => "100x100>" } 
     :storage => :s3, 
     ## example credentials path 
     :s3_credentials => Rails.root.join('config/amazon_s3.yml').to_s, 
     :s3_protocol => 'https', 
     :path => "logo/:basename.:extension" 
+1

감사합니다. 안타깝게도 내 이미지 URL 소스의 끝에 % 3F1415584752가 표시됩니다. 추가 데이터를 추가하는 이유는 무엇입니까? – tomc0920

+0

몇 달 동안 Paperclip/AWS를 완벽하게 작동시킨 후에도이 문제가 발생하기 시작했습니다. 이 문제를 유발하기 위해 내가 무엇을 바꿨는지 잘 모르겠습니다. –