Как назначить удаленный файл Carrierwave?

У меня есть видеомодель со следующим определением:

class Video
  require 'carrierwave/orm/activerecord'
  mount_uploader :attachment, VideoUploader
  mount_uploader :attachment_thumbnail, VideoThumbnailUploader
  ...
end

Когда я загружаю видеофайл. Он также отправляет файл в нашу службу кодирования Zencoder, которая кодирует видеофайл и создает для него миниатюру.

Обычно я мог бы сделать что-то вроде @video.attachment.url, который вернет путь к видеофайлу. Я хотел бы сделать то же самое с миниатюрой. например @video.attachment_thumbnail.url

Однако, поскольку вложение создается нашей службой кодирования, которая также загружает его в указанную корзину S3. Как назначить вложение в столбец attachment_thumbnail для записи?

Могу ли я просто сделать что-то вроде:

@video.update_attributes(
  :attachment_thumbnail => 'https://bucket_name.s3.amazonaws.com/uploads/users/1/video/1/thumb.png'
)

Можно ли такие файлы назначать Carrierwave?


person Christian Fazzini    schedule 15.02.2011    source источник
comment
Ты смотришь рельсовые передачи, не так ли? ;) Вы использовали скрепку раньше? Какой из них вы предпочитаете?   -  person Robin    schedule 15.02.2011
comment
Привет, Робин, попробовал Скрепку. Я предпочитаю Carrierwave. Просто личное предпочтение :-)   -  person Christian Fazzini    schedule 15.02.2011
comment
Проверьте ответ здесь. update_column пропускает обратные вызовы, позволяя вам обновить атрибут без повторной загрузки изображения CarrierWave. stackoverflow.com/questions/16968658/   -  person pejmanjohn    schedule 23.08.2013


Ответы (4)


Вы можете сделать следующее:

@video.remote_attachment_thumbnail_url = 'https://bucket_name.s3.amazonaws.com/uploads/users/1/video/1/thumb.png'

Но это приведет к тому, что Carrierwave загрузит + переобработает файл, а не просто сделает его миниатюрой. Если вы не собираетесь использовать обработку Carrierwave, то может иметь смысл просто сохранить URL-адрес миниатюры на модели, а не использовать Carrierwave.

person ctide    schedule 15.02.2011
comment
Почему @video.remote_attachment_thumnail_url заставляет Carrierwave загружать и повторно обрабатывать файл? - person Christian Fazzini; 15.02.2011
comment
Вы просто говорите несущей волне захватить файл оттуда, а не загружать файл. Обычно он используется в формах для ввода пользователем URL-адреса изображения, которое он хотел бы загрузить. - person ctide; 15.02.2011
comment
ctide, я только что попробовал: @video.update_attributes(:attachment_thumbnail =› 'bucket_name.s3.amazonaws.com/uploads/users/1/video/1/), и я получаю: CarrierWave::FormNotMultipart: CarrierWave::FormNotMultipart. Я думаю, вы не можете сделать @video.remote_attachment_thumnail_url = 'bucket_name.s3.amazonaws.com/uploads/users/1/video/1/thumb.png', что просто одно и то же. Или я что-то упускаю? - person Christian Fazzini; 16.02.2011
comment
Это не одно и то же, remote_[uploader]_url — это метод экземпляра, который сообщает Carrierwave загрузить файл с этого URL-адреса. См.: github.com/jnicklas/carrierwave/blob/master/ lib/carrierwave/ строка 87 Кроме того, это не атрибут, поэтому вы не можете установить его через update_attributes. - person ctide; 16.02.2011
comment
Можно ли назначить удаленный файл только CarrierWave? Это означает, что его не нужно загружать или перерабатывать, а просто назначать. Чтобы я мог использовать помощник как таковой: @video_attachment_thumbnail.url - person Christian Fazzini; 18.02.2011
comment
Нет, Carrierwave не поддерживает это, потому что вы пытаетесь исключить все, что делает Carrierwave, при этом используя Carrierwave. Если вы просто хотите сохранить URL-адрес изображения, сохраните URL-адрес изображения в своей базе данных, это будет намного проще. - person ctide; 18.02.2011
comment
Хорошо, это имеет смысл. С другой стороны, я пробовал следующее: ›› Video.last.remote_attachment_thumbnail_url = 'bucket_name.s3.amazonaws.com/uploads/users/3/video/29/'. В консоли возвращается: bucket_name.s3.amazonaws .com/uploads/users/3/video/29/, но когда я набираю Video.last.attachment_thumbnail.url, я получаю ноль. Я делаю что-то неправильно? - person Christian Fazzini; 18.02.2011
comment
сделайте video.last_attachment_thumbnail_url и создайте в своей БД поле с именем last_attachment_thumbnail_url в таблице видео и сохраните его там. Добавив больше разделителей (точек), вы просто запутаете активную запись! - person ctide; 18.02.2011
comment
Привет! Я пытаюсь назначить удаленный URL-адрес моему загрузчику, а не строку URL-адреса для моего столбца БД - person Christian Fazzini; 18.02.2011
comment
потратил часы, пытаясь понять это сегодня, спасибо за совет re: remote_xxx_url - person stephenmurdoch; 22.08.2011
comment
кажется, теперь необходимо обновить атрибут «загрузчик» вручную (Rails 3.1.3 Carrwave (0.5.7)), например, результат = @video.remote_attachment_thumbnail_url = 'some_remote_img.png' и @video.update_attribute(:attachment_thumbnail,result), тогда все будет работать нормально - person Mike Li; 28.12.2011

Это сработало для меня с CarrierWave 0.5.8

model.update_attributes(:remote_uploader_url => "http://path/to/image.jpg")

Конечно, для этого вам нужно установить remote_uploader_url на attr_accessible.

person asif    schedule 03.07.2012

Я тоже искал это.

Блокирующим моментом в случае с зенкодером будет то, что Carrierwave не отслеживает разные версии файлов разных типов для исходного файла. Он ссылается только на исходный файл.

Таким образом, наличие исходного файла в формате .mp4 и уменьшенной версии в формате .png не работает. Хотя у вас может быть «image.png», а также отслеживать «thumb_png_image.png», вы не можете также создать «thumb_jpg_image.jpg» для того же файла.

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

person tomek    schedule 27.07.2012

В конце этого эпизода (7:35) Райан Бейтс добавляет remote_image_url в форму загрузки файла:

http://railscasts.com/episodes/253-carrierwave-file-uploads

person Benjamin Crouzier    schedule 26.04.2013