Rails 5.2 Shrine 和 Tus 服务器:无法创建自定义文件夹结构来保存文件



我正在使用rails 5.2,Shrine 2.19和tus服务器2.3进行可恢复文件上传

路线.rb

mount Tus::Server => '/files'

模型, file_resource.rb

class FileResource < ApplicationRecord
# adds an `file` virtual attribute
include ResumableFileUploader::Attachment.new(:file)

控制器/files_controller.rb

def create
file = FileResource.new(permitted_params)
...
file.save

config/initializers/shrine.rb


s3_options = {
bucket: ENV['S3_MEDIA_BUCKET_NAME'],
access_key_id: ENV['S3_ACCESS_KEY'],
secret_access_key: ENV['S3_SECRET_ACCESS_KEY'],
region: ENV['S3_REGION']
}
Shrine.storages = {
cache: Shrine::Storage::S3.new(prefix: 'file_library/shrine_cache', **s3_options),
store: Shrine::Storage::S3.new(**s3_options), # public: true,
tus: Shrine::Storage::Tus.new
}
Shrine.plugin :activerecord
Shrine.plugin :cached_attachment_data

config/initializers/tus.rb

Tus::Server.opts[:storage] = Tus::Storage::S3.new(
prefix: 'file_library',
bucket: ENV['S3_MEDIA_BUCKET_NAME'],
access_key_id: ENV['S3_ACCESS_KEY'],
secret_access_key: ENV['S3_SECRET_ACCESS_KEY'],
region: ENV['S3_REGION'],
retry_limit: 3
)
Tus::Server.opts[:redirect_download] = true

我的问题是我无法覆盖Shrine类的generate_location方法,以将文件存储在 AWS s3 中的不同文件夹结构中。

所有文件都是在s3://bucket/file_library/中创建的(tus.rb 中提供的前缀(。我想要类似s3://bucket/file_library/:user_id/:parent_id/文件夹结构的东西。

我发现 Tus 配置覆盖了我所有的resumable_file_uploader类自定义选项,并且对上传没有影响。

resumable_file_uploader.rb

class ResumableFileUploader < Shrine
plugin :validation_helpers  # NOT WORKS
plugin :pretty_location     # NOT WORKS
def generate_location(io, context = {})  # NOT WORKS
f = context[:record]
name = super # the default unique identifier
puts "<<<<<<<<<<<<<<<<<<<<<<<<<<<<"*10
['users', f.author_id, f.parent_id, name].compact.join('/')
end
Attacher.validate do                    # NOT WORKS
validate_max_size 15 * 1024 * 1024, message: 'is too large (max is 15 MB)'
end
end

那么如何使用 tus 选项在 S3 中创建自定义文件夹结构(因为神社选项不起作用(?

tus 服务器上传根本不会触及 Shrine,因此不会调用#generate_location,而是由tus-ruby-server决定位置。

请注意,tus 服务器应该只充当临时存储,您仍然应该使用 Shrine 将文件复制到永久存储(又名"提升"(,就像常规直接上传一样。在升级时,将调用#generate_location方法,因此文件将被复制到所需位置;这一切都会在默认的 Shrine 设置下自动发生。

最新更新