Rails - изменить размер изображения перед загрузкой на s3

Я использую гем s3_direct_upload для загрузки изображений в s3 с помощью Rails. Эта жемчужина основана на этой Railscast и использует jQuery-file-upload. Это работает хорошо.

Теперь я хотел бы изменить размер своих изображений перед их загрузкой. Для реализации этого была создана ветвь, но автор упомянул, что :

«Мне пришлось закомментировать метод добавления, так как он останавливает очередь процессов. Я не знаю, почему… Но поскольку я не загружал много файлов одновременно, кажется, мне все равно не нужен этот обратный вызов».

Мне удалось реализовать эту вилку, но индикатор выполнения и события загрузки больше не вызываются, поэтому я попытался реализовать вилку самостоятельно, чтобы реализовать все свои функции.

Приведенный ниже код coffeescript не выдает никаких ошибок, но и не изменяет размер:

setUploadForm = ->
$uploadForm.fileupload
  disableImageResize: /Android(?!.*Chrome)|Opera/.test(window.navigator && navigator.userAgent)
  imageMaxWidth: settings.image_max_width
  imageMaxHeight: settings.image_max_height
  disableImagePreview: true

Итак, теперь я пытаюсь заменить событие add, как предложил автор, но я борюсь с логикой. Исходный код выглядит так:

  add: (e, data) ->
   file = data.files[0]
   file.unique_id = Math.random().toString(36).substr(2,16)     

  unless settings.before_add and not settings.before_add(file)
      current_files.push data
      if $('#template-upload').length > 0
        data.context = $($.trim(tmpl("template-upload", file)))
        $(data.context).appendTo(settings.progress_bar_target || $uploadForm)
      else if !settings.allow_multiple_files
        data.context = settings.progress_bar_target
      if settings.click_submit_target
        if settings.allow_multiple_files
          forms_for_submit.push data
        else
          forms_for_submit = [data]
      else
        data.submit()

и автор заменил вышеизложенное на:

   send: (e, data) ->
    file = data.files[0]
    if settings.before_send
      settings.before_send(file)

Я хотел бы заменить add на send, если это позволит изменять размер изображений, но я также хочу сохранить индикатор выполнения загрузки и события загрузки. Я попытался заменить before_add на before_send, но это создает бесконечный цикл:

unless settings.before_send and not settings.before_send(file)

Мой форк можно найти здесь


person Marklar    schedule 19.08.2013    source источник
comment
Вы смотрели на rmagick и CarrierWave или CarrierWave_Direct?   -  person jcm    schedule 21.08.2013
comment
Я читал статью о загрузке на s3, и что касается Carrierwave_direct, они заявили, что я нашел его довольно паршивым, так как он заставляет вас изменять настройки несущей волны (удаление метода store_dir, правда?) и работает только для одного файла. Мне понравился jQuery-File-Upload, потому что он имеет индикатор выполнения и его легко реализовать. Кроме того, в Railscast Райан проходит много шагов, чтобы заставить загрузку s3 работать с несущей волной, снова jQuery-File-Upload показался более простым.   -  person Marklar    schedule 22.08.2013
comment
Спустя годы, но я пытаюсь найти решение и для этого... кто-нибудь понял это?   -  person Jason Galuten    schedule 01.10.2015
comment
@JasonGaluten, как вы указали, прошло пару лет, поэтому трудно вспомнить, но я думаю, что решение, которое я только что опубликовал, было тем, как оно было решено.   -  person Marklar    schedule 14.10.2015


Ответы (2)


Проблема была в функции инициализации:

this.initialize = function() {
  $uploadForm.data("key", $uploadForm.find("input[name='key']").val());

  //binded add function here to let the plugin execute it's default add behaviour
  setUploadForm().bind('fileuploadadd' , function(e, data) {
      var file;
      file = data.files[0];
      file.unique_id = Math.random().toString(36).substr(2, 16);
      if (!(settings.before_add && !settings.before_add(file))) {
        current_files.push(data);
        if ($('#template-upload').length > 0) {
          data.context = $($.trim(tmpl("template-upload", file)));
          $(data.context).appendTo(settings.progress_bar_target || $uploadForm);
        } else if (!settings.allow_multiple_files) {
          data.context = settings.progress_bar_target;
        }
        //this part was causing the problem it was adding images for processing which hasn't been processed.
        /*if (settings.click_submit_target) {
          if (settings.allow_multiple_files) {
            return forms_for_submit.push(data);
          } else {
            return forms_for_submit = [data];
          }
        } else {
          return data.submit();
        }*/
      }
    });
  return this;
};
person Marklar    schedule 13.10.2015

Вы можете использовать драгоценный камень rmagick. В вашем гемфайле

gem 'rmagick', '2.13.2'

затем bundle install.

драгоценный камень Rmagick

Вам также нужно будет установить ImageMagick в вашей системе:

двоичные файлы ImageMagick

Затем вы можете использовать его из своего приложения. Смотрите эту рельсовую трансляцию:

Обработка изображений Railscast

Соответствующий код:

require "rmagick"

source = Magick::Image.read("octocat.png").first
source = source.resize_to_fill(70, 70)
person jcm    schedule 22.08.2013
comment
ОП спрашивает об изменении размера изображения на стороне клиента. - person Jason Galuten; 01.10.2015