2012-03-29 3 views
3

내 인생을 위해 기본 paperclip example의 작동 방식을 이해할 수 없습니다. 이 컨트롤러에 포함 된 하나의 라인, 그리고 그것은 단순히 그 S3에 이미지를 업로드하는 데 필요한 모든 얼마나 이해하지종이 클립 젬을 사용하여 S3에 이미지를 업로드하는 방법

@user = User.create(params[:user]) 

입니다. 예를 약간 변경 한 이유는 기본 레일 폼 도우미 대신 jquery file uploader을 사용하고 싶었 기 때문에 이미지가 내 컨트롤러에 게시되는 시점에 있었지만, params에서 이미지를 가져 와서 첨부 파일로 지정해야합니다.

Parameters: {"files"=>[#<ActionDispatch::Http::UploadedFile:0x132263b98 @tempfile=#<File:/var/folders/5d/6r3qnvmx0754lr5t13_y1vd80000gn/T/RackMultipart20120329-71039-1b1ewde-0>, @headers="Content-Disposition: form-data; name=\"files[]\"; filename=\"background.png\"\r\nContent-Type: image/png\r\n", @content_type="image/png", @original_filename="background.png">], "id"=>"385"}

내 JS는 매우 간단하다 : 여기 로그를보고 있어요 무엇

` $('#fileupload').fileupload({ 
    dataType: 'json', 
    url: '/my_url', 
    done: function (e, data) { 
     console.log('done'); 
    } 
});` 

나를 아는 것이 도움이 내가 게시에서 파일 데이터를 제거 할 수있는 방법입니다 것이 무엇 위에서 주어진 매개 변수를 클립에 전달합니다. 첨부 파일 속성에 File.open (...) 값을 지정해야하지만, 내 파일의 소스가 무엇인지 알 수는 없습니다.

나는 이것을 이해하려고 애쓰는 데 엄청난 시간을 들였고, 나는 그것을 얻지 못하는 것 같습니다. s3에 직접 업로드를 시도했지만 이벤트 체인이 끔찍한 혼란을 겪었으므로이 간단한 통과 예제를 먼저 완성하려고합니다. cna가 제공하는 모든 도움에 감사드립니다.

답변

4

몇 조각이 더 필요하며 사용중인 정확한 코드를 표시 할 수 있다면 도움이됩니다.

종이 클립을 사용하여 S3에 게시 할 수 있습니다 :

컨트롤러, 그것은 모든 PARAMS 함께 보내는 사용자 모델을 생성

http://rubydoc.info/gems/paperclip/Paperclip/Storage/S3

. 이를 "질량 할당"이라고합니다 (attr_accessible에 대해 읽으십시오).

모델이 params를 받으면 모델 클립 클립을 업로드하는 Paperclip AWS 프로세서를 사용합니다.

AWS gem, S3의 유효한 버킷 및 구성 파일이 필요합니다.

이 블로그 포스트를 시도하고 당신이 도움이된다면 저희에게 알려 :

http://blog.trydionel.com/2009/11/08/using-paperclip-with-amazon-s3/

UPDATE 2013년 4월 3일가 : 당신이 추가 매개 변수를해야 할 수도 있습니다 below-- 클로이의 의견을 참조 기쁘시게을, 그리고 블로그 게시물이 오래된 것일 수 있습니다. 수동으로 수행 할 경우

+0

필자는이 점을 많이 알고 있지만 params가 Paperclip이 기대하는 모든 특성을 포함 할 것으로 기대할 수있는 이유를 알지 못합니다. 양식 도우미가이 문제를 처리하지 않는다면 이해할 수 있지만 양식 도우미를 사용하지 않으므로 해결 방법을 찾아야합니다. 일부 JS와 함께 OP를 편집했습니다. 감사합니다. –

+0

제 제안은 jQuery없이 데모 프로그램으로 작업하게하는 것입니다. 그것이 성공적으로 작동하면 jQuery를 추가하십시오. 이 방법을 사용하면 단계별로 작업하는 것이 더 쉬워집니다. – joelparkerhenderson

+0

블로그 게시물이 잘못되었습니다. 아마 구형 일거야. 단계를 수행 한 후에 오류가 발생했습니다. Paperclip RubyDoc에서 언급되지 않은 한 가지는 has_attached_file에': storage => : s3'을 추가하는 것입니다. 마치': s3_credentials'만으로도 충분하지만, 그렇지 않은 것처럼 들린다. – Chloe

1

, 이런 식으로 접근 :

# In order to get contents of the POST request with the photo, 
# you need to read contents of request 
upload = params[:file].is_a(String) 
file_name = upload ? params[:file] : params[:file].original_filename 
extension = file_name.split('.').last 

# We have to create a temp file which is going to be used by Paperclip for 
# its upload 
tmp_file = "#{Rails.root}/tmp/file.#{extension}" 
file_id = 0 

# Check if file with the name exists and generate unique path 
while File.exists?(tmp_file) do 
    tmp_file_path = "#{Rails.root}/tmp/file#{file_id}.#{extension}" 
    id += 1 
end 

# Let's write the file from post request to unique location 
File.open(tmp_file_path, 'wb') do |f| 
    if upload 
    f.write request.body.read 
    else 
    f.write params[:file].read 
    end 
end 

# Now that file is saved in temp location, we can use Paperclip to mimic one file 
# upload 
@photo = Photo.new :photo => File.open(tmp_file_path) 

# We'll return javascript to say that the file is uploaded and put its thumbnail in 
# HTML or whatever else you wanted to do with it 
respond_to do |format| 
    if @photo.save 
    render :text => "Success" 
    else 
    render :text => @photo.errors 
    end 
end 

당신은 당신의 create 또는 당신이 무엇을 URL로 사용하는 양식을 게시 할 대상 다시 작성할 수 있습니다.

0

이 비트 :

"files"=>[#<ActionDispatch::Http::UploadedFile:0x132263b98 @tempfile=#  <File:/var/folders/5d/6r3qnvmx0754lr5t13_y1vd80000gn/T/RackMultipart20120329-71039-1b1ewde-0> 

양식에 게시 된 파일의 내용을 보유하는 부분 (내 생각)입니다.has_attached_file

통과 [: PARAMS]를 User.create 방법이 있습니다에 예를 들어, 그들에 어떤 처리를 수행 파일 내용을 데리러 도우미 (크기 조정 있음을 레일에서

, 사용자 모델은 도우미를해야합니다 헬퍼에게 제공된 속성을 기반으로) 이미지를 저장 장치에 푸시합니다 (예 : S3 또는 기타 - S3 자격 증명이 도우미에게 전달됨).

'어떻게 작동합니까?' 질문

jQuery 비트를 다시 작성하십시오. 코드가 있어야하지만, Rails 양식을 사용하지 않는 이유는 무엇입니까? remote => true이고 jquery에서 응답을 처리합니까?