Загрузка тысяч изображений с помощью Paperclip на S3 - PullRequest
2 голосов
/ 24 июня 2011

У меня есть ~ 16 000 изображений, которые я пытаюсь загрузить в Amazon. Прямо сейчас они в моей локальной файловой системе. Я хотел бы загрузить их на S3 с помощью Paperclip, но я НЕ хочу сначала загружать их на свой сервер. Я использую Heroku, и они ограничивают размер пули.

Есть ли способ использовать грабли для загрузки изображений непосредственно из моей локальной файловой системы в S3 через Paperclip?

Ответы [ 3 ]

3 голосов
/ 24 июня 2011

Вы можете настроить свое приложение на использование Amazon S3 для хранения скрепок в процессе разработки ( см. Мой пример ) и загружать файлы с помощью задачи rake, например:

Допустим, ваша папка с изображениями была в your_app_folder/public/images, вы можете создать грабельное задание, похожее на это.

namespace :images do
  desc "Upload images."
  task :create => :environment do
    @images = Dir["#{RAILS_ROOT}/public/images/*.*"]
    for image in @images
      MyModel.create(:image => File.open(image))
    end
  end
end
1 голос
/ 24 июня 2011

Да.Я сделал нечто подобное в своем первом личном проекте Rails.Вот предыдущий вопрос SO ( Paperclip S3 скачать удаленные изображения ), чей ответ связан с тем, где я нашел свой ответ так давно (http://trevorturk.com/2008/12/11/easy-upload-via-url-with-paperclip/).

0 голосов
/ 29 мая 2012

Отличный ответ Джонни Грасса и отличный вопрос Крис.У меня было несколько сотен файлов TIF на моем локальном компьютере, Heroku, paperclip и s3.Некоторые из tiff-файлов были размером> 100 МБ, поэтому заставление герою обратить внимание на эту долгую отложенную работу и некоторую дополнительную работу.Поскольку это был в основном однократный пакетный процесс (по 5 различных форм изображений, созданных на каждой по 5 загрузок), идея граблей идеально подходила.Здесь, в случае, если это помогает, это задача rake, которую я создал, предполагая, как Джонни написал, что ваша база данных разработки имеет текущие данные (используйте pg backup, чтобы получить новый набор идентификаторов) и подключена к S3.

У меня естьМодель называется «Предмет» с вложением «Изображение».Я хотел проверить, было ли уже у существующих Предметов изображение, и если нет, загрузить новый.Эффект заключается в зеркалировании каталога исходных файлов.Хорошим дополнением может быть проверка дат и просмотр обновленного локального tif.

# lib/image_management.rake
namespace :images do
  desc 'upload images through paperclip with postprocessing'
  task :create => :environment do

    directory = "/Volumes/data/historicus/_projects/deeplandscapes/library/tifs/*.tif"
    images = Dir[directory]

    puts "\n\nProcessing #{ images.length } images in #{directory}..."

    items_with_errors = []
    items_updated = []
    items_skipped = []

    images.each do |image|
    # find the needed record
      image_basename = File.basename(image)
      id = image_basename.gsub("it_", "").gsub(".tif", "").to_i
      if id > 0
        item = Item.find(id) rescue nil
        # check if it has an image already
        if item
          unless item.image.exists?
            # create the image
            success = item.update_attributes(:image => File.open(image))
            if success
              items_updated << item
              print ' u '
            else
              items_with_errors << item
              print ' e '
            end
          else
            items_skipped << item
            print ' s '
          end
        else
          print "[#{id}] "
        end
      else
        print " [no id for #{image_basename}] "    
      end
    end
    unless items_with_errors.empty?
      puts "\n\nThe following items had errors: "
      items_with_errors.each do |error_image|
        puts "#{error_image.id}: #{error_image.errors.full_messages}"
      end
    end

    puts "\n\nUpdated #{items_updated.length} items."
    puts "Skipped #{items_skipped.length} items."
    puts "Update complete.\n"

  end
end
...