Создание MiniMagick Montage на лету из изображений, загруженных с Shrine на S3 - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь создать файл монтажа, состоящий из различных миниатюр, загруженных (в частном порядке) на S3 с помощью Shrine.

Код этого действия находится у работника Sidekiq (в Heroku), который должен отправить электронное письмо свыше обработанное изображение в виде вложения электронной почты. (Затем просто выдает изображение)

Вот моя попытка:

images = []

@user.photos.first(25).each do |photo|
  images << File.read(photo.image[:thumb].url)
end

processed_image = MiniMagick::Tool::Montage.new do |image|
        images.each {|i| image << i} 
        image.tile "5x5"
        image << "output.jpg"        
end

attachments.inline['images.jpg'] = processed_image

Хотя я получаю сообщение об ошибке:

2019-11-04T18: 17: 59.638Z 30695 TID-ot0uksdbv ПРЕДУПРЕЖДЕНИЕ: Errno :: ENOENT: Нет такого файла или каталога @ rb_sysopen - https://mysite.s3.eu -west-1.amazonaws.com / photo / thumb / 5cb924406fa8944e5279a15b46f250f6.jpg? X-Amz-Algorithm =-HMAC-SHA256 и X-Amz-Credential = AKIAIJJCEGJCEVP2A% 2F20191104% 2Feu-запад 1% 2Fs3% 2Faws4_request & X-Amz-Date = 20191104T181759Z & X-Amz-Истекает = 900 & X-АМЗ-SignedHeaders = хост и X-Amz-Signature = 38706b7526fd0a8095a2f387521063d4d8901c4523696ff7e1f60ae2d

Кажется, он не может открыть большой палец на S3 (я обфусцировал ссылку выше, но при вставке в браузер он возвращает изображение правильно)

Я попытался передатьссылка прямо в блоке:

images << photo.image[:thumb].url

Но на этот раз кажется, что я получаю ошибки от MiniMagick

montage-im6.q16: не авторизовано HTTPS' @ error/delegate.c/InvokeDelegate/1717. montage-im6.q16: unable to open file ': такого файла нетили каталог @ error / constitute.c / ReadImage / 544. montage-im6.q16: не разрешено HTTPS' @ error/delegate.c/InvokeDelegate/1717. montage-im6.q16: unable to open file ': операция не разрешена @ error / constitute.c / ReadImage / 544. montage-im6.q16: не разрешено HTTPS' @ error/delegate.c/InvokeDelegate/1717. montage-im6.q16: unable to open file ': операция не разрешена @ error / constitute.c / ReadImage / 544. montage-im6.q16: не разрешено HTTPS' @ error/delegate.c/InvokeDelegate/1717. montage-im6.q16: unable to open file ': операция не разрешена @ error / constitute.c / ReadImage / 544. montage-im6.q16: не авторизован `HTTPS '@ error / Delegate.c / InvokeDelegate / 1717.

Не очень уверен, как справиться с этим ..

1 Ответ

1 голос
/ 05 ноября 2019

Вам необходимо загрузить файлы на диск перед обработкой и использовать локальные пути в вашей команде montage. Кроме того, вам нужно будет прочитать файл результатов по выходному пути, так как команда montage возвращает только стандартный вывод.

Вместе это может выглядеть примерно так:

# download input images to disk
input_images = @user.photos.first(25)
  .map { |photo| photo.image[:thumb] }
  .map(&:download)

# create temporary file for output image
processed_image = Tempfile.new ["montage", ".jpg"], binmode: true

MiniMagick::Tool::Montage.new do |montage|
  montage.merge! input_images.map(&:path)
  montage.tile "5x5"
  montage << processed_image.path
end

attachments.inline['images.jpg'] = File.binread(processed_image.path)

# close and delete temporary files
[*input_images, processed_image].each(&:close!)
...