如何为同名文件实现附件版本控制?对于 5.2

How to implement attachment versioning for files with same names? RoR 5.2

基于 RoR 5.2 的项目。对于附件上传,我使用 Carrierwave gem 和 AWS S3 存储桶作为存储。

我需要对上传的同名文件实施版本控制。

我的意思是当我上传一个新文件时,同名文件不应该被替换。 例如:模型用户有一个安装的文档上传器。如果我将上传名称为 «doc.docx» 的文件,然后我将为同一模型对象上传另一个具有相同名称的文件,旧文件将被新文件替换。

我已经调查过我可以生成令牌或添加时间戳以获得唯一的文件名,但如果我要为同一对象上传具有相同名称(例如 'doc.docx')的新文件,我需要这样做,它应该重命名为 'doc(1).docx' 或 'doc_1.docx'。而新的会更名为'doc(2).docx'或'doc_2.docx'等

已在 AWS 面板中为此存储桶启用版本控制。

有什么办法可以实现吗?我已准备好从 Carrierwave 更改为 Active Storage。但是我还没有找到至少一个这样的案例。

有什么建议吗? 提前致谢!

我对重命名有一些想法。首先,我们可以拆分你的问题:

  1. 文件重命名问题
  2. 文件版本控制问题

我用类似的代码(载波 + 视频处理)重命名解决了我的问题。在这里,我为上传的视频创建了缩略图版本,有一个特定的名称(写你的自定义函数而不是 png_name,你可以检查一些以前上传的文件等):

# Create different versions of your uploaded files:
# ffmpegthumbnailer
version :thumb do
  process thumbnail: [{ format: 'png', size: 360, logger: Rails.logger }]
  def full_filename for_file
    png_name for_file, version_name
  end
end

version :preview do
  process thumbnail: [{ format: 'png', size: 600, logger: Rails.logger }]
  def full_filename for_file
    png_name for_file, version_name
  end
end

def png_name(for_file, version_name)
  %Q{#{version_name}_#{for_file.chomp(File.extname(for_file))}.png}
end

并且您可以通过创建代理模型来解决版本控制问题。例如,您有 User 模型,而不是创建名为 Document 的关联。您可以将上传器挂载到文档模型,并使用上面的代码进行重命名。

class User < ApplicationRecord
  has_many :documents, dependent: :destroy

  def last_document
    documents.last
  end
end

class Document < ApplicationRecord
  mount_uploader :file, DocumentUploader
  validates_integrity_of :file
end