несущей волны: указать на существующее изображение

В моем приложении rails я использую Carrierwave для загрузки изображений на Amazon S3. Я хотел бы указать на существующие изображения Amazon S3 без повторной загрузки изображения. Например, если у меня есть существующий образ Amazon S3 по адресу http://test.s3.amazonaws.com/image/path/0001/image.jpg, могу ли я обновить путь к изображению, чтобы он указывал на это изображение? Я не хочу использовать опцию удаленной загрузки, потому что я действительно просто хочу использовать то же самое изображение, которое уже есть (но сохранить его в атрибуте «путь» моей записи).

В консоли пробовал:

image.update_attributes(:path=> "http://test.s3.amazonaws.com/image/path/0001/image.jpg")

но это не может переопределить путь изображения.


person scientiffic    schedule 14.07.2013    source источник
comment
Как вы смогли это решить?   -  person Mohamad    schedule 26.12.2013
comment
В итоге я не создал новую запись, а просто указал на исходную запись.   -  person scientiffic    schedule 26.12.2013
comment
привет @научный, ты нашел решение для этого? мне очень интересно   -  person medBouzid    schedule 03.01.2014


Ответы (4)


Присоединяйтесь, лучше поздно, чем никогда! Предостережение: это для рельсов 4, и в данный момент я тестирую только рельсы 4.1.

Это сложнее, чем должно быть, мне кажется! Причина, по которой это было абсолютно важно для меня, заключалась в том, что я прикрепляю файлы MP3 размером более 100 МБ, которые я не могу получить на своем хосте из-за ограничений CloudFlare SSL (и здравого смысла). К счастью, AWS поддерживает предварительно авторизованную загрузку, и мне помогли операторы поддержки:

Шаг 1: попросите CarrierWave сообщить мне, где бы он хранил файл, если бы мог:

 m.raw_write_attribute('file','file.mp3');
 url = m.file.url
 signed = aws_presigned_url(url)

raw_write_attribute ничего не сохраняет, просто пропускает несущую при установке значения. Это заставляет объект действовать так, как если бы он читал «file.mp3» из базы данных. Затем вы можете спросить у Carrierwave, «где живет файл». Затем я загружаю файл прямо с клиента на S3. Когда это сделано, я делаю еще один вызов API к Rails, который выполняет следующий код:

 m.raw_write_attribute('file','file.mp3');
 m.update_attribute('file','file.mp3');

Эти две пары обходят Carrierwave. Первый заставляет Carrwave думать, что столбец «файл» имеет значение «file.mp3», второй явно указывает rails сохранять «file.mp3» в БД. Из-за вызова raw_write_attribute Carrierwave пропускает второй без изменений.

person Daniel    schedule 26.02.2015

В моем случае update_column и update_columns отлично сработали:

model.update_columns file_1: 'filename.txt'

Столбец обновления с запятой:

model.update_column :file_1, 'filename.txt'

Это не будет запускать обратный вызов и устанавливать столбец в filename.txt.

Когда я делаю model.file_1.url, я получаю правильный URL-адрес S3.

person sites    schedule 26.09.2016

Я немного опоздал на вечеринку, но вы можете использовать метод raw_write_attribute Active Record, например:

@image.raw_write_attribute(:path, "http://test.s3.amazonaws.com/image/path/0001/image.jpg")

person Joni    schedule 14.04.2014
comment
Насколько я могу судить, это не сохраняет значение в БД и даже не позволяет вам записать его в БД с помощью @image.save, потому что с точки зрения модели нечего сохранять ! - person Daniel; 26.02.2015

Я обнаружил, что вы действительно можете сделать это, например, если ваш mount_uploader равен :path, тогда:

image.remote_path_url = "http://test.s3.amazonaws.com/image/path/0001/image.jpg"
image.save
person shinnyx    schedule 30.07.2013
comment
Спасибо за ваш ответ. Как я уже упоминал в своем исходном сообщении, я не хотел повторно загружать файл, что, как я полагаю, вы делаете с помощью remote_path_url и сохраняете. - person scientiffic; 30.07.2013
comment
По какой причине вы не хотите повторно загружать файл? В моем случае он заменит существующий файл и все равно будет быстрее, чем загрузка с локального компьютера. К сожалению, я не вижу альтернативных путей для несущей без этого. - person shinnyx; 31.07.2013
comment
Я обнаружил, что повторная загрузка файла слишком медленная для моего приложения. Вместо этого я просто определяю, указывает ли новая запись на другое изображение, и заменяю изображение в представлении (а не в моей базе данных). - person scientiffic; 31.07.2013