2009-08-17 10 views
2

У меня есть приложение rails, которое использует attachment_fu. В настоящее время он использует :file_system для хранения, но я хочу изменить его на :s3, чтобы обеспечить лучшее масштабирование при загрузке большего количества файлов.Что связано с изменением схемы хранения attach_fu?

Что с этим связано? Я предполагаю, что если я просто переключу код на использование :s3, все старые ссылки будут сломаны. Нужно ли просто копировать существующие файлы из файловой системы в S3? Поиск в Google не сильно повлиял на эту тему.

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

EDIT: Итак, это не так просто, как копирование по файлам на S3; URL-адреса создаются с использованием другой схемы. Когда они хранятся в :file_system, файлы попадают в такие места, как /public/photos/0000/0001/file.name, но тот же файл в :s3 может оказаться в 0/1/file.name. Я думаю, что он использует id что-то и просто заполняет его (или нет) нулями, но я не уверен в этом.

ответ

4

Это правильно. Иды дополняются, используя: хранилище file_system. Вместо того чтобы переименовывать все ваши файлы, вы можете изменить модуль бэкэнда s3 для использования дополненных номеров.

Скопируйте partitioned_path метод от file_system_backend.rb и поместите его в s3_backend.rb.

def partitioned_path(*args) 
     if respond_to?(:attachment_options) && attachment_options[:partition] == false 
     args 
     elsif attachment_options[:uuid_primary_key] 
     # Primary key is a 128-bit UUID in hex format. Split it into 2 components. 
     path_id = attachment_path_id.to_s 
     component1 = path_id[0..15] || "-" 
     component2 = path_id[16..-1] || "-" 
     [component1, component2] + args 
     else 
     path_id = attachment_path_id 
     if path_id.is_a?(Integer) 
      # Primary key is an integer. Split it after padding it with 0. 
      ("%08d" % path_id).scan(/..../) + args 
     else 
      # Primary key is a String. Hash it, then split it into 4 components. 
      hash = Digest::SHA512.hexdigest(path_id.to_s) 
      [hash[0..31], hash[32..63], hash[64..95], hash[96..127]] + args 
     end 
     end 
    end 

full_filename метод Изменить s3_backend.rb «ы использовать partitioned_path.

def full_filename(thumbnail = nil) 
     File.join(base_path, *partitioned_path(thumbnail_name_for(thumbnail))) 
    end 

attachment_fu теперь будет создавать пути с теми же именами, как это было с file_system бэкэндом, так что вы можете просто скопировать файлы на s3 без переименования все.

2

В дополнение к nilbus' ответ, я должен был изменить s3_backend.rb «base_path метод s вернуть пустую строку, в противном случае было бы вставить attachment_path_id дважды:

def base_path 
    return '' 
end 
2

То, что сработало для меня, в дополнение к nilbus годов ответ, должен был изменить метод s3_backend.rb в base_path по-прежнему использовать path_prefix (который по умолчанию имя таблицы):

def base_path 
    attachment_options[:path_prefix] 
end 

А также, я должен был взять attachment_path_id от file_system_backend.rb и заменить один в s3_backend.rb, так как в противном случае partitioned_path всегда думал, что мой первичный ключ был Строка:

def attachment_path_id 
    ((respond_to?(:parent_id) && parent_id) || id) || 0 
end 
0

Спасибо за все те ответы, которые помогли много. Это сработало и для меня, но я должен был сделать это, чтобы использовать :thumbnail_class:

def full_filename(thumbnail = nil) 
    prefix = (thumbnail ? thumbnail_class : self).attachment_options[:path_prefix].to_s 
    File.join(prefix, *partitioned_path(thumbnail_name_for(thumbnail))) 
end 

 Смежные вопросы

  • Нет связанных вопросов^_^