PaperClip - сохранить новое вложение, не удаляя старое - PullRequest
2 голосов
/ 09 ноября 2011

Я использую Paperclip (с Amazon s3) в Rails 3. Я хочу прикрепить новый файл к моей модели без замены старого файла. Я не хочу, чтобы старый файл был доступен, я только хочу, чтобы он был там на s3 в качестве резервной копии. Вы знаете, есть ли способ заставить скрепку ухаживать за ней, сама?

в post.rb у меня есть:

has_attached_file :sound,
        :storage => :s3,
        :s3_credentials => "....",
        :styles => {:mp3 => {:format => :mp3}},
        :processors => [:sound_processor],
        :s3_host_alias => '....',
        :bucket => '....',
        :path => ":attachment/:id/:style/out.:extension",
        :url => ":s3_alias_url"

и процессор выглядит следующим образом:

class Paperclip::SoundProcessor < Paperclip::Processor

  def initialize file, options = {}, attachment = nil
    super

    @format = options[:format] || "mp3"
    @current_format = File.extname(@file.path)
    @basename = File.basename(@file.path, @current_format)
  end

  def make
    src = @file
    dst = Tempfile.new([@basename,".#{@format}"])
    dst.binmode

    cmd = "ffmpeg -y -ab 128k -t 600 -i #{File.expand_path(src.path)} #{File.expand_path(dst.path)}"
    Paperclip.log(cmd)
    out = `#{cmd}`
    raise Paperclip::PaperclipError, "processor does not accept the given audio file" unless $?.exitstatus == 0

    dst
  end

end

Ответы [ 3 ]

4 голосов
/ 09 ноября 2011

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

before_create :timestamp_filename

def timestamp_filename
  fname = Time.now.to_s(:db).gsub(/[^0-9]/,'') + '_' + sound_file_name
  sound.instance_write(:file_name, fname)
end

# override paperclip's destroy files
# method to always keep them around
def destroy_attached_files
  true
end
0 голосов
/ 15 ноября 2011

Вот хороший ресурс, на который вы можете посмотреть: http://eggsonbread.com/2009/07/23/file-versioning-in-ruby-on-rails-with-paperclip-acts_as_versioned/

Создает новые версии файла. Надеюсь, это поможет.

0 голосов
/ 09 ноября 2011

Довольно просто добавить версии в ваши модели, недавно я использовал CarrierWave и paper_trail в сочетании, чтобы добиться этого.Мы внедрялись в Heroku, поэтому S3 тоже был в миксе.

Причина, по которой я публикую это как ответ, заключается в том, что, хотя я и спорю, я не думаю, что библиотеки, такие как PaperClip, должны поддерживать резервное копирование файлов, библиотека, специально предназначенная для решения этой проблемы, лично мне кажется лучше.1005 *

...