使用Carrierwave下载多个文件

按位

我已经使用Carrierwave启用了多个上传功能。但是,现在我试图找出如何一次批量下载所有上传内容的方法。

要清楚。我有一个Attachment可以包含文件表。当我上传多个文件时,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)收集您要ZIP的对象

@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

我们正在使用两个宝石(但是我不确定在这里是否都需要它们):
-rubyzip
-zip-zip

警告

据我记得,文件名存在一个问题。例如,如果您的文件包含中文字符,则在Windows计算机上无法正确解压缩。我们通过删除这些字符来解决它,并添加了一些字符串(例如文件ID)以避免文件名空。

希望对您有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章