Как загрузить изображение на S3 с помощью скрепки Gem - PullRequest
3 голосов
/ 30 марта 2012

На всю жизнь я не могу понять, как работает базовый пример скрепки .В контроллере есть только одна строка, и это

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

Я просто не понимаю, как это все, что нужно для загрузки изображения в s3.Я немного изменил пример, потому что хотел использовать jquery file uploader , а не помощник по умолчанию для rails, так что я нахожусь в точке, где изображение отправляется в мой контроллер, но яне могу понять, как я должен взять изображение из параметров и назначить его в качестве вложения.Вот что я вижу в журналах:

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');
    }
});`

Мне было бы полезно узнать, как яможет удалить данные файла из параметров POSTed, указанных выше, и передать их скрепке.Я уверен, что мне придется присвоить атрибуту вложения значение File.open (...), но я не знаю, каков источник моего файла.

Я потратил смешную суммувремени, пытаясь понять это, и я не могу понять это.Я пытался загрузить напрямую в s3, но цепочка событий была очень запутанной, поэтому я хочу, чтобы сначала был завершен этот простой пример сквозного прохождения.Большое спасибо за любую помощь, которую вы можете дать!

Ответы [ 3 ]

4 голосов
/ 30 марта 2012

Вам нужно еще несколько штук, и это поможет, если вы сможете показать точный код, который вы используете.

Скрепку можно отправить на S3 с помощью:

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

Когда ваш контроллер создает модель пользователя, он отправляет все параметры. Это называется «массовое назначение» (обязательно прочитайте об attr_accessible).

Когда ваша модель получает параметры, она использует процессор Paperclip AWS, который ее загружает.

Вам понадобится гем AWS, допустимое ведро на S3 и файл конфигурации.

Попробуйте это сообщение в блоге и сообщите нам, поможет ли оно вам:

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

ОБНОВЛЕНИЕ 2013-04-03: Пожалуйста, смотрите комментарий Хлои ниже - вам может понадобиться дополнительный параметр, и запись в блоге может быть устаревшей.

1 голос
/ 31 марта 2012

Если вы хотите сделать это вручную, подойдите к нему следующим образом:

# 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 голосов
/ 27 августа 2012

Этот бит:

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

- это часть (я думаю), которая содержит содержимое файла, размещенного в форме.

В Rails модель User будет иметь помощника: has_attached_file

Передача [: params] в метод User.create позволяет этому помощнику подобрать содержимое файла, выполнить любую обработку над ним (например, изменить размер и т. Д. На основе атрибутов, предоставленных помощнику), а затем отправить изображение (изображения) в хранилище (например, S3 или что-то еще - учетные данные S3 передаются помощнику).

Надеюсь, это объясняет, "как это происходит?" вопрос

re бит jQuery .. не уверен, какой код должен быть там, но почему бы не использовать форму Rails с: remote => true и обработать ответ в jquery?

...