使用 Carrierwave 下载多个文件
Download multiple files with Carrierwave
我已经使用 Carrierwave 启用了多重上传。但是现在我想弄清楚如何通过一次批量操作下载所有上传的内容。
说清楚。我有一个 Attachment
table 可以有文件。当我上传多个文件时,Carrierwave 可以很好地保存它们。
当前尝试(不工作)
<div>
<%= "#{index + 1}. Upload:" %>
<%= link_to "Download", attachment.files[0].identifier, download: attachment.files[0].identifier %>
<%= attachment.files[0].identifier %>
</div>
尝试从文件数组下载一个文件时出错:
ActionController::UnknownFormat (ComplianceSubmissionsController#edit is missing a template for this request format and variant.
request.formats: ["text/html"]
request.variant: []):
这个错误不是我怀疑的真正问题。
我正在寻找一种批量下载保存在 S3 上并使用 Carrierwave 上传的文件的方法,很难找到这方面的好文档,因为 Carrierwave 没有任何关于这种情况的文档。
在我们的应用程序中,我们允许客户将多个文件下载为 ZIP 文件。
来自我的应用程序的示例
1) 收集要压缩的对象
@objects_to_zip = Files.all
2) 将每个对象转换为散列(不是必需的,但让我们的生活更轻松):
@objects_to_zip = @objects_to_zip.map(&:convert_object_to_a_hash)
#/app/models/file.rb
def convert_object_to_a_hash
{
name: sanitized_filename(FILE_NAME),
extension: 'FILE_EXTENSION',
content: FILE_CONTENT
}
end
def sanitized_filename(file_name)
max_name_length = 50
Zaru.sanitize!(file_name, :padding=>(255-max_name_length)).gsub(/[[:punct:]]+/, ' ').gsub(/\p{S}/, ' ').gsub(/[[:space:]]+/, '_').downcase
end
3) 创建存档并将结果发送给客户端
send_data(create_archive(@objects_to_zip), :type => 'application/zip', :filename => "#{ZIP_FILENAME}.zip")
#app/helpers/zip_helpers.rb
module ZipHelpers
def create_archive(files)
string_io = Zip::OutputStream.write_buffer do |zio|
Array(files).each do |file|
zio.put_next_entry("#{file.fetch(:name).gsub('/', '-')}.#{file.fetch(:extension)}")
zio.write file.fetch(:content)
end
end
string_io.rewind
string_io.read
end
end
我们使用了两个 gem(但我不确定这里是否需要它们):
- rubyzip
- 压缩压缩
警告
据我所知,文件名存在一个问题。例如,如果您的文件包含中文字符,它将无法在 Windows 台机器上正确解压缩。我们通过删除这些字符来解决它,并添加了一些字符串(如文件 ID)以避免空文件名。
希望对你有所帮助。
我已经使用 Carrierwave 启用了多重上传。但是现在我想弄清楚如何通过一次批量操作下载所有上传的内容。
说清楚。我有一个 Attachment
table 可以有文件。当我上传多个文件时,Carrierwave 可以很好地保存它们。
当前尝试(不工作)
<div>
<%= "#{index + 1}. Upload:" %>
<%= link_to "Download", attachment.files[0].identifier, download: attachment.files[0].identifier %>
<%= attachment.files[0].identifier %>
</div>
尝试从文件数组下载一个文件时出错:
ActionController::UnknownFormat (ComplianceSubmissionsController#edit is missing a template for this request format and variant.
request.formats: ["text/html"]
request.variant: []):
这个错误不是我怀疑的真正问题。
我正在寻找一种批量下载保存在 S3 上并使用 Carrierwave 上传的文件的方法,很难找到这方面的好文档,因为 Carrierwave 没有任何关于这种情况的文档。
在我们的应用程序中,我们允许客户将多个文件下载为 ZIP 文件。
来自我的应用程序的示例
1) 收集要压缩的对象
@objects_to_zip = Files.all
2) 将每个对象转换为散列(不是必需的,但让我们的生活更轻松):
@objects_to_zip = @objects_to_zip.map(&:convert_object_to_a_hash)
#/app/models/file.rb
def convert_object_to_a_hash
{
name: sanitized_filename(FILE_NAME),
extension: 'FILE_EXTENSION',
content: FILE_CONTENT
}
end
def sanitized_filename(file_name)
max_name_length = 50
Zaru.sanitize!(file_name, :padding=>(255-max_name_length)).gsub(/[[:punct:]]+/, ' ').gsub(/\p{S}/, ' ').gsub(/[[:space:]]+/, '_').downcase
end
3) 创建存档并将结果发送给客户端
send_data(create_archive(@objects_to_zip), :type => 'application/zip', :filename => "#{ZIP_FILENAME}.zip")
#app/helpers/zip_helpers.rb
module ZipHelpers
def create_archive(files)
string_io = Zip::OutputStream.write_buffer do |zio|
Array(files).each do |file|
zio.put_next_entry("#{file.fetch(:name).gsub('/', '-')}.#{file.fetch(:extension)}")
zio.write file.fetch(:content)
end
end
string_io.rewind
string_io.read
end
end
我们使用了两个 gem(但我不确定这里是否需要它们):
- rubyzip
- 压缩压缩
警告
据我所知,文件名存在一个问题。例如,如果您的文件包含中文字符,它将无法在 Windows 台机器上正确解压缩。我们通过删除这些字符来解决它,并添加了一些字符串(如文件 ID)以避免空文件名。
希望对你有所帮助。