如何为同名文件实现附件版本控制?对于 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。但是我还没有找到至少一个这样的案例。
有什么建议吗?
提前致谢!
我对重命名有一些想法。首先,我们可以拆分你的问题:
- 文件重命名问题
- 文件版本控制问题
我用类似的代码(载波 + 视频处理)重命名解决了我的问题。在这里,我为上传的视频创建了缩略图版本,有一个特定的名称(写你的自定义函数而不是 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
基于 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。但是我还没有找到至少一个这样的案例。
有什么建议吗? 提前致谢!
我对重命名有一些想法。首先,我们可以拆分你的问题:
- 文件重命名问题
- 文件版本控制问题
我用类似的代码(载波 + 视频处理)重命名解决了我的问题。在这里,我为上传的视频创建了缩略图版本,有一个特定的名称(写你的自定义函数而不是 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