Обработка изображений Rails Carrierwave для Amazon S3

Я загружаю изображения с помощью загрузки jquery на Amazon s3, я использую несущую волну Ruby Gems и туман, чтобы заставить его работать... Но я пытаюсь сделать, когда я загружаю изображение на s3, изображение, сгенерированное несущей волной, которое будет store в amazon S3 не должен превышать 500 КБ, даже если исходный загруженный файл img был 3 МБ или больше.

в основном я не хочу контролировать и ограничивать размер конечного изображения.

А также еще 1 вещь, что мне делать, если я не хочу отслеживать высоту и ширину моих файлов в Amazon S3. т. е. я не хочу сохранять эти WxH изображений в базу данных, чтобы у меня была ссылка, если мне это нужно.

Любые комментарии, идеи или предложения приветствуются.

Спасибо.


person King Pangilinan    schedule 16.12.2011    source источник


Ответы (1)


Хорошим шаблоном для использования является загрузка файла непосредственно в Amazon s3, а затем добавление его в ваше приложение с помощью Carrierwave из этого места. Если вы сохраните файл во временной корзине/местоположении на s3, вы сможете эффективно обработать несущей волны, а затем переместить его. После того, как он будет напрямую загружен на s3 и если у вас есть корзина и адрес, на который вы его загрузили, вы можете использовать такой код, чтобы Carrierwave забрал его, обработал и «переместил»:

  def add_file_from_URL(bucket, object_address)
    s3 = AWS::S3::new
    bucket = s3.buckets[bucket]
    object = bucket.objects[object_address]
    object_url = object.url_for(:read, :expires => 60*60, :secure => true) #expires in 1 hour
    self.remote_attachment_url = object_url.to_s
    self.save
    object.delete()
  end

Этот код войдет в вашу модель, в которой есть файл.

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

Чтобы отслеживать метаданные для файла, я бы предложил использовать обратный вызов :before_save для хранения этой информации в полях рядом с файлом. У вас будет такой метод:

  private
    def update_file_attributes
      if file.present?
        self.file_content_type = attachment.file.content_type
        self.file_size = attachment.file.size
      end
    end

В этом примере я сохраняю фактический размер файла, но вместо этого вы можете настроить его для размеров. Это входит в модель, в которой вы сохраняете файл.

person Joel Friedlaender    schedule 17.12.2011