Работа с изображениями Rails Carrierwave для Amazon S3 - PullRequest
1 голос
/ 17 декабря 2011

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

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

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

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

Спасибо.

1 Ответ

2 голосов
/ 17 декабря 2011

Хорошим примером для использования является загрузка файла непосредственно в Amazon s3, а затем добавление его в приложение с помощью Carrierwave из этого места. Если вы храните файл во временном контейнере / месте на s3, вы можете эффективно обработать и переместить carrierwave. После того, как он напрямую загружен в 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

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

...