2

我正在使用s3_direct_upload gem 通过 Rails 将图像上传到 s3。这个 gem 基于这个 Railscast并使用jQuery-file-upload。它运作良好。

我现在想在上传图片之前调整它们的大小。创建了一个 fork来实现这一点,但作者提到:

“我不得不注释掉 add 方法,因为它会停止进程队列。我不知道为什么......但由于我没有同时上传许多文件,看来我无论如何都不需要那个回调。”

我已经能够实现这个 fork,但是不再调用进度条和上传事件,所以我尝试自己实现一个 fork 来实现我的所有功能。

下面的咖啡脚本代码不会引发任何错误,但也不会调整大小:

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)

如果允许图像调整大小,我想替换addsend,但我也想保留上传进度条和上传事件。我尝试替换before_add为,before_send但它会创建一个无限循环:

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

我的叉子可以在这里找到

4

2 回答 2

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;
};
于 2015-10-13T23:28:24.973 回答
-1

您可以使用 rmagick 宝石。在你的 gemfile

gem 'rmagick', '2.13.2'

然后bundle install

魔法宝石

您还必须在系统上安装 ImageMagick:

ImageMagick 二进制文件

然后,您可以在您的应用程序中使用它。看到这个railscast:

图像处理 Railscast

相关代码:

require "rmagick"

source = Magick::Image.read("octocat.png").first
source = source.resize_to_fill(70, 70)
于 2013-08-22T04:02:20.513 回答