如何在 Rails 5.x.x 应用程序中以 Zip 格式从 S3 下载多个文件?

Posted

技术标签:

【中文标题】如何在 Rails 5.x.x 应用程序中以 Zip 格式从 S3 下载多个文件?【英文标题】:How to download multiple files from S3 as Zip format in Rails 5.x.x app? 【发布时间】:2017-06-22 08:19:29 【问题描述】:

我正在实现允许用户从 S3 下载单个文件或多个文件的功能。 单个文件下载工作正常,但对于多个文件,我在 Heroku 上收到错误,

Errno::ENOENT (No such file or directory @ rb_file_s_lstat )

用于下载zip格式文件的控制器代码sn-p如下,

def method_name
   zipfile_name = "#Rails.root/public/archive.zip"
   Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile |
     @transfer.transfer_attachments.each do |attachment | 
       zipfile.add(attachment.avatar.file.filename, attachment.avatar.url)
     end
   end
   send_file(File.join("#Rails.root/public/", 'archive.zip'), : type =>
'application/zip', : filename => "#Time.now.to_date.zip")
end

宝石文件

ruby '2.3.1'

gem 'rails', '~> 5.0.1'

gem 'rubyzip', '>= 1.0.0'

gem 'zip-zip'

此 zipfile 功能适用于本地存储的文件。

【问题讨论】:

【参考方案1】:

我想回答我的问题。 步骤如下,

    从 S3 下载文件并存储在本地 首先创建 zip,然后将文件添加到其中,将它们添加到 zip。 下载压缩包

这是控制器代码,

require 'open-uri'

def download_all_files
   folder_path = "#Rails.root/public/downloads/"
   zipfile_name = "#Rails.root/public/archive.zip"

   FileUtils.remove_dir(folder_path) if Dir.exist?(folder_path)
   FileUtils.remove_entry(zipfile_name) if File.exist?(zipfile_name)
   Dir.mkdir("#Rails.root/public/downloads")

   @model_object.each do |attachment|
      open(folder_path + "#attachment.avatar.file.filename", 'wb') do |file|
         file << open("#attachment.avatar.url").read
      end
   end

   input_filenames = Dir.entries(folder_path).select |f| !File.directory? f

   Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
      input_filenames.each do |attachment|
         zipfile.add(attachment,File.join(folder_path,attachment))
      end
   end

   send_file(File.join("#Rails.root/public/", 'archive.zip'), :type => 'application/zip', :filename => "#Time.now.to_date.zip")

end

【讨论】:

您知道如何为每个被压缩的文件指定一个自定义名称吗? 谢谢。是的,您可以在将文件添加到 zip 文件夹时执行此操作。 取决于文件的大小和用户数量,它可能不适用于有点高的卷!?【参考方案2】:

猜测:您正在将附件添加为 url,但您应该添加(本地)文件路径。

【讨论】:

所有文件都上传到 S3。在zipfile.add() 中,我传递了文件名及其实际 URL(存储在 S3 上)。另一件重要的事情是,此代码可以正常处理本地存储的文件。 这就是我的意思:您可能必须先从 S3 下载文件,然后 zip 库才能将它们添加到您的 zip 文件中。 是的,明白了。我会实施它。谢谢

以上是关于如何在 Rails 5.x.x 应用程序中以 Zip 格式从 S3 下载多个文件?的主要内容,如果未能解决你的问题,请参考以下文章

Rails 在 CORS 预检选项请求中以 404 响应

如何将 Rails 环境变量放在 apple-app-site-association 文件中以获取通用链接?

在 ruby​​ on rails 中以一对多关系创建新记录

Rails 和 JQuery-将 DB 数据加载到文本字段中以进行保存和删除

在 Ruby on Rails/JS 中以模式呈现新表单而不是新页面

你如何使用mongoose 5.x.x的arrayFilters? [重复]