【问题标题】:Download multiple files with Carrierwave使用 Carrierwave 下载多个文件
【发布时间】:2018-05-26 15:22:51
【问题描述】:

我已启用 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 文件。它对你有用吗?
  • 这似乎很理想@MrShemek。您是否有机会向我指出您正在谈论的内容的示例或对此类事物有益的库?

标签: ruby-on-rails ruby carrierwave


【解决方案1】:

在我们的应用程序中,我们允许客户端以 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(但我不确定这里是否需要两个 gem):
- ruby​​zip
- 拉链

警告

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

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多