2011-12-16 4 views
1

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

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

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

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

Спасибо.

ответ

2

Хороший шаблон для загрузки - загрузить файл непосредственно на 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 

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