9

Пользователи моего сайта могут загружать собственные фотографии для модели или выбирать из библиотеки. Когда пользователи выбирают из библиотеки, я отправляю имя файла в виде строки на сервер {file: {url: 'url.jpg'}}. Я не нашел способ, с помощью которого wavewave может просто обновить файл модели без его загрузки. Я могу написать условие в моей модели, которое проверяет наличие этого параметра, а затем model.file = File.open('str.jpg'). Это плохо с точки зрения безопасности? Как я могу «загрузить» файлы или просто обновить атрибут файла, чтобы ссылаться на файл, который уже доступен на сервере?Carrierwave - «загрузка» файла из строки

Спасибо!

ответ

4

Ваше решение использовать File.open будет работать, но вы должны убедиться, что имя действительно с File.basename поэтому кто-то не мог пройти мимо ../../secret_credentials.yml и выставлять информацию, которую вы не хотите. Также неплохо было бы проверить его на список предустановленных изображений.

Однако вы можете сделать это более эффективно, пропустив CarrierWave в этом случае.

Добавить новое поле под названием library_image, когда кто-то хочет использовать предустановленное изображение, тогда вы устанавливаете library_image, если они хотят использовать свою собственную фотографию, unset library_image и загрузить фотографию как обычно. Затем добавить вспомогательный метод, как:

def avatar_url 
    if self.library_image? 
     "http://example.com/images/#{self.library_image}" 
    else 
     self.picture.url 
    end 
end 

Это предполагает, что вы можете найти предустановленные изображения в http://example.com/images/[name] и вы используете mount_uploader в CarrierWave имени picture.

Теперь, когда вы хотите отобразить их фотографию, вы должны позвонить avatar_url, который будет проверять, должен ли он возвращать заданный URL-адрес или загруженное изображение.

Примера того, как вы обновите library_image или picture на основе оригинального вопроса:

if params[:file].is_a?(Hash) 
    model.library_image = params[:file][:url] 
    model.remove_picture = true 
else 
    model.library_image = nil 
    model.picture = params[:file] 
end 
+0

Как я могу обнаружить, что пользователь загружает новую картину? Я имею в виду, каково имя функции обратного вызова, которое я должен написать, чтобы сбросить библиотеку? Спасибо! – CamelCamelCamel

+0

@CamelCamelCamel Я обновил свой первоначальный ответ на примере. –

+0

Как вернуть файл как пресет или файл в зависимости от аватара_url? – CamelCamelCamel

3

Я бы сделал еще один ресурс под названием LibraryImages, в котором хранятся эти файлы изображений.

Они были бы связаны с классом User с использованием ассоциации has_many. второй - это отдельный, когда пользователь хочет использовать свое собственное изображение вместо предварительно определенного.

поэтому я бы предложил добавить булевой тип под названием 'use_library', как только они захотят использовать свое собственное изображение, оно просто загрузится в user.image без проблем.

теперь ваш взгляд просто спросить, если use_library возвращает истину, если так использовать image_tag(user.library_image)

Смежные вопросы