Загрузка картинок Ruby on Rails - PullRequest
38 голосов
/ 07 декабря 2009

Я новичок в рельсах, так что извините, если это легко. Мне интересно, как лучше загрузить картинки и показать их в Ruby on Rails. У меня есть блог, и я хотел бы иметь возможность прикрепить изображение при создании сообщения.

Ответы [ 8 ]

25 голосов
/ 07 декабря 2009

Скрепка довольно крутая. Об этом есть отличный RailsCast - http://railscasts.com/episodes/134-paperclip

18 голосов
/ 08 декабря 2011

CarrierWave - более новая жемчужина, чем Paperclip, и выглядит намного более гибкой Об этом также есть Railscast: http://railscasts.com/episodes/253-carrierwave-file-uploads

7 голосов
/ 07 декабря 2009

Если вам не нужны необычные функции, вы не хотите добавлять зависимости и хотите сохранить изображение в виде BLOB в вашей БД, вы можете сделать что-то вроде:

Модель:

class Image < ActiveRecord::Base
  def img=(input_data)
    self.filename = input_data.original_filename
    self.filetype = input_data.content_type.chomp
    self.img = input_data.read
  end
end

Контроллер:

class ImagesController < ApplicationController
  def display_img
    @img = Image.find(params[:id])
    send_data(@img.img, :type => @img.filetype, :filename => @img.filename,
              :disposition => 'inline')
  end
end

Вот ссылка на более полный учебник.

4 голосов
/ 06 мая 2015

Многие рекомендуют использовать Carrierwave, и я не исключение, но я хотел бы отметить одну вещь. На многих сайтах, написанных с использованием RoR (очевидно, это не только проблема RoR), я замечаю, что запрос, отправляющий изображение, может быть отложен примерно на 2-3 секунды, а часто даже больше, что связывает экземпляр приложения (что, вероятно, не так уж страшно) если вы используете потоки или не заботитесь о производительности, но это определенно так, если вы используете единорога). Поэтому я объясню, как избежать этого с помощью carrierwave:

1) Выберите фонового работника для своего приложения (я обычно использую Sidekiq)

2) Добавьте carrierwave_backgrounder в ваш Gemfile и настройте его для работы с вашим фоновым работником и оператором транспортной волны (все в файле readme)

У меня обычно есть контроль над моими каталогами, поэтому я использую опцию store_in_background, равную carrierwave_backgrounder, которая обрабатывает и сохраняет изображение в файловой системе или S3 или любом другом используемом вами

3) Теперь, когда вы обновляете изображение, его обработка и сохранение переходят в фоновый режим, что освобождает экземпляр вашего приложения, но занимает некоторое время, в большинстве случаев более 1 секунды, и вам необходимо вернуть какой-то ответ пользователю

4) Самый простой способ предоставить пользователю какой-либо ответ - это вернуть javascript, в котором вы меняете старое изображение на gif с помощью счетчика или чего-то в этом роде, и устанавливаете функцию javascript SetInterval, которая проверяет, обработано ли изображение (carrierwave_background предоставляет функцию, которая может изменить логический столбец вашей модели на true, когда она завершит обработку), отправляя запрос AJAX каждые 2 секунды или по своему усмотрению и изменяя изображение после его обработки.

Теперь у вас есть несвязанный экземпляр приложения и отличный пользовательский интерфейс одновременно.

PS Я новичок в рельсах и веб-разработке как таковой, поэтому в этом руководстве могут быть некоторые предупреждения, которые я пропустил

Надеюсь, это кому-нибудь поможет.

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

3 голосов
/ 19 апреля 2012

CarrierWave, вероятно, является лучшим решением для загрузки изображений в Rails. В следующем посте описывается решение для загрузки изображений с использованием CarrierWave, в то время как преобразования изображений выполняются без проблем в облаке. Загруженные изображения хранятся в облаке и доставляются через CDN. Не нужно устанавливать RMagick, MiniMagick и ImageMagick. http://cloudinary.com/blog/ruby_on_rails_image_uploads_with_carrierwave_and_cloudinary

3 голосов
/ 07 декабря 2009

Многие люди рекомендуют PaperClip . Возможно, вы хотите сначала попробовать это.

2 голосов
/ 07 декабря 2009

attachment_fu (http://github.com/technoweenie/attachment_fu) - это еще один вариант, хотя я лично рекомендую скрепка . Это не требует Rmagick, что является большим плюсом, и поддерживает некоторые интересные функции, такие как загрузка на S3 с незначительной конфигурацией.

1 голос
/ 21 сентября 2018

сентябрь 2018

Для тех, кто недавно проверял этот вопрос, Rails 5.2+ теперь имеет ActiveStorage по умолчанию, и я настоятельно рекомендую проверить его.

Поскольку теперь он является частью основного Rails 5.2+, он очень хорошо интегрирован и обладает отличными возможностями из коробки (все же все другие известные драгоценные камни, такие как Carrierwave, Shrine, paperclip, ... великолепны, но один предлагает очень хорошие возможности, которые мы можем рассмотреть для любого нового проекта Rails)

Команда Paperclip устарела в пользу Rails ActiveStorage.

Вот страница github для ActiveStorage и множество ресурсов доступно везде

...