2

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

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

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

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

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) 

Моя вилка может быть найдена here

+0

Вы взглянули на RMagick и carrierwave или carrierwave_direct? – jcm

+0

Я читал статью о загрузке на s3, и в отношении carrierwave_direct они заявили: «Я нашел ее довольно дрянной, так как она заставляет вас менять настройки несущей волны (удаляя метод store_dir, на самом деле?), И это работает только для одного файл". Мне понравилась jQuery-File-Upload, потому что она имеет индикатор выполнения и была легко реализована. Плюс в Railscast Райан проходит много шагов, чтобы загрузить s3 с поддержкой wavewave, снова jQuery-File-Upload выглядел более прямолинейно. – Marklar

+0

Спустя годы, но я пытаюсь найти решение для этого ... кто-нибудь понял это? –

ответ

1

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

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; 
}; 
-1

Вы можете использовать RMagick камень. В вашем gemfile

gem 'rmagick', '2.13.2' 

bundle install.

Rmagick gem

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

ImageMagick binaries

Вы можете затем использовать его в вашем приложении. Смотрите эту railscast:

Image Manipulation Railscast

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

require "rmagick" 

source = Magick::Image.read("octocat.png").first 
source = source.resize_to_fill(70, 70) 
+0

ОП запрашивает изменение размера изображения на стороне клиента. –