5

我不知道如何在 rails 3.2.6 中更新/重命名使用 Carrierwave-mongoid 上传/管理的文件。我想重命名数据库和文件系统中的文件。

像这样的东西也许...

def rename( id , new_name )
  f = UploadedFile.find(id)

  if f.update_attributes({ f.file.original_filename: new_name })  # this is WRONG, what is right???
    new_path = File.join( File.dirname( f.file.current_path ) , new_name ))
    FileUtils.mv( f.file.current_path , new_path )
  end

  return f
end

让我添加这个是在它已经上传之后。

4

6 回答 6

5

尽管我确信有一种更优雅的方式,但我能够完成以下工作。我很感激对以下内容的任何评论

*将此添加到 app/uploaders/file_uploader.rb

def rename(new_name)
  sf = model.file.file
  new_path = File.join( File.dirname( sf.file ) , "#{new_name}#{File.extname( sf.file )}")
  new_sf = CarrierWave::SanitizedFile.new sf.move_to(new_path)
  model.file.cache!(new_sf)
  model.save!
  return model
end

谢谢!

于 2012-10-19T20:13:26.047 回答
2

最有效的方法是移动现有的 S3 对象(假设您的存储层是 S3):

def rename(new_name)
  bucket_name = "yourapp-#{Rails.env}"
  resource = Aws::S3::Resource.new
  bucket = resource.bucket(bucket_name)
  object = bucket.object(path)
  new_filename = "#{new_name}#{File.extname(path)}"
  new_path = File.join(File.dirname(path), new_filename)
  object.move_to(bucket: bucket_name, key: new_path)

  model.update_column(mounted_as, new_filename)
  model.reload

  # Now call `recreate_versions!(*versions.keys)`
  # if you want versions updated. Explicitly passing
  # versions will prevent the base version getting
  # reuploaded.

  model
end

这是使用aws-sdk-s3宝石。

于 2018-10-17T15:21:40.557 回答
1

我将图像文件和衍生版本存储在与 S3 兼容的解决方案中。我在 Rails 5.1 上使用 Carrierwave (1.2.2) 和 "fog-aws" gem (3.0.0)。当添加到“上传器”文件(例如,app/uploaders/example_uploader.rb)时,以下公共方法适用于我:

class ExampleUploader < CarrierWave::Uploader::Base
  <snip>

  # Renames original file and versions to match given filename
  #
  # Options:
  # * +:keep_original+ - Do not remove original file and versions (ie, copy only)
  def rename(new_filename, options = {})
    return if !file || new_filename == file.filename
    target = File.join(store_path, new_filename)
    file.copy_to(target)
    versions.keys.each do |k|
      target = File.join(store_path, "#{k}_#{new_filename}")
      version = send(k).file
      version.copy_to(target)
    end
    remove! unless options[:keep_original]
    model.update_column(mounted_as, new_filename) && model.reload
  end

  <snip>
end
于 2019-08-31T18:02:47.977 回答
0

基于@user892583,我对其进行了研究并提出了一个更简单的解决方案:

def rename!(new_name)
  new_path = File.join(File.dirname(file.file), new_name)
  file.move_to(new_path)
end
于 2014-06-22T20:53:24.670 回答
0

在我的上传文件中修改版本设置(文件名和图像大小)后,我使用这个 rake 任务重新处理上传的图像:

# Usage: rake carrierwave:reprocess class=Model
namespace :carrierwave do
  task :reprocess => :environment do

    CLASS = ENV['class'].capitalize
    MODEL = Kernel.const_get(CLASS)
    records = MODEL.all

    records.each do |record|
      record.photo.recreate_versions! if record.photo?
    end

  end
end

笔记:

  • 用您命名上传者的任何内容替换“照片”。
  • Rake 任务位于 lib/tasks 文件夹中。
  • 这是使用 Active Record,不确定 Mongoid 是否需要不同的东西。
于 2012-10-19T01:41:37.873 回答
0

我是这样做的:

  def filename
    if !cached? && file.present?
      new_filename = 'foobar'
      new_path = File.join(File.dirname(file.path), new_filename)
      file.move_to(new_path)
      recreate_versions!
      new_filename
    else
      super
    end
  end

我认为这是重命名文件的唯一正确方法。

于 2018-01-05T16:31:08.343 回答