Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 回形针--保存新附件而不删除旧附件_Ruby On Rails_Paperclip - Fatal编程技术网

Ruby on rails 回形针--保存新附件而不删除旧附件

Ruby on rails 回形针--保存新附件而不删除旧附件,ruby-on-rails,paperclip,Ruby On Rails,Paperclip,我正在Rails 3上使用回形针(带Amazon s3)。我想在不替换旧文件的情况下将新文件附加到模型。我不想让旧文件被访问,我只想让它在s3上作为备份。 你知道有没有办法让回形针自己去处理它 在post.rb中,我有: has_attached_file :sound, :storage => :s3, :s3_credentials => "....", :styles => {:mp3 => {:format =>

我正在Rails 3上使用回形针(带Amazon s3)。我想在不替换旧文件的情况下将新文件附加到模型。我不想让旧文件被访问,我只想让它在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
类曲别针::声音处理器<曲别针::处理器 def初始化文件,选项={},附件=nil 超级的 @格式=选项[:格式]| |“mp3” @当前_格式=File.extname(@File.path) @basename=File.basename(@File.path,@current\u格式) 结束 def制造 src=@file dst=Tempfile.new([@basename,“.#{@format}]”) dst.binmode cmd=“ffmpeg-y-ab 128k-t 600-i#{File.expand#u path(src.path)}{File.expand#u path(dst.path)}” 回形针日志(cmd) out=`{cmd}` 升起回形针::回形针或,“处理器不接受给定的音频文件”,除非$?。exitstatus==0 dst 结束 结束
我就是这么做的。我在保存文件名之前给文件名加上时间戳(以防止另一个同名文件覆盖原始文件),并强制回形针从不删除任何内容

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

将版本控制添加到模型中非常简单,最近我使用用户CarrierWave和in组合来实现这一点。我们部署到Heroku,所以S3也在其中


我之所以将此作为答案发布,是因为,尽管存在争议,但我不认为像曲别针这样的库应该支持文件备份,专门解决此问题的库对我个人来说感觉更好。

这里有一个很好的资源,您可以查看:

它创建文件的新版本。希望这有帮助