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

2024-04-05

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

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

用于下载 zip 格式文件的控制器代码片段如下,

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

Gemfile

ruby '2.3.1'

gem 'rails', '~> 5.0.1'

gem 'rubyzip', '>= 1.0.0'

gem 'zip-zip'

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


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

  1. 从S3下载文件并将其存储在本地
  2. 首先创建 zip,然后将文件添加到其中,将它们添加到 zip。
  3. 下载 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • Android 应用程序自动且静默更新?

    我开发了一个应用程序 想要更新自身 并想要以下功能 设备已植根 1 自动检查可以每次启动时更新 我可以做到 2 将apk文件下载到本地 我可以做 3 使用自定义对话框更新 或者静默更新 我不知道 编辑 我的应用程序在带遥控器的电视上运行 默
  • 组合框事件 SelectedValueChanged

    我有一个简单的问题 可能有人在我之前问过它 但我找不到它 假设我有一个数据表 其中包含来自数据库的一些数据 我想将它绑定到一个组合框 我使用这样的标准代码 comboBox1 BeginUpdate comboBox1 ValueMembe
  • XAML,将 Width 和 Height 属性绑定到其他控件的相同属性

    我正在尝试创建反射效果 它工作得很好 只是我必须对一些值进行硬编码 这是我的 XAML
  • 从现有数据库自动生成 JHipster 实体

    作为 JHispster 2 11 0 的一部分 实体配置保存在 jhipster 目录中的特定 json 文件中 这些文件可用于使用以下命令在 JHipster 应用程序中重新生成实体和相关文件 哟 jhipster 实体 ENTITY
  • UNIX fork 之后,指向动态分配内存的指针会发生什么情况?

    有人请澄清 fork 之后指针会发生什么 据我了解 指向堆栈上或静态分配的任何内容的指针都是相对于堆栈 数据段寄存器的 因此在分叉期间准确复制它们是可以的 但是 如果我在 fork 之前 malloc 某些东西会发生什么 例如 void p
  • PHP:同时打开 URL 来模拟 DOS 攻击?

    我已经用各种反 DOS 模块 mod qos mod evasive 等 配置了我的服务器 我现在想做的是运行一个简单的 PHP 脚本 多次调用我网站上的 URL 以达到网站上的各种限制 理想情况下 能够以某种方式同时打开多个 URL 的脚
  • Android 上的原始套接字

    我想创建一个在 Android 上运行并使用原始套接字的应用程序 我发现 java net 或 android net 库中没有任何原始套接字支持 Android 上可以使用原始套接字吗 正确的是 任何 Java 或 Android 库都不
  • 使用 Gnuplot 进行时间序列的线性回归

    我是 Gnuplot 的忠实粉丝 我在学习过程中一直将它用于各种项目 最近我想使用 Gnuplot 来绘制一些时间序列图 例如减肥 锻炼结果 气体消耗等 因此我像这样缩放x轴 set xdata time set timefmt d m Y
  • 使用 lodash 从数组返回对象属性

    我一直试图通过首先过滤对象来返回对象的属性 这就是我所做的 var characters name barney age 36 blocked false name fred age 40 blocked true name pebbles
  • JpaRepository、@Transaction 和repository.saveAndFlush

    我正在第一次尝试服务 存储库方法 但遇到了一个问题 本质上 我想在我的服务中做的是保留我的实体 然后在相同的服务方法中使用它的 ID 最初我打算使用 GenerateValue 和 Sequences 但放弃并决定手动刷新实体并获取 ID
  • 水晶报表日期公式使其成为月底

    我是 CR 新手 需要一个公式来为我提供日期字段上的月底 a 如果日期是 628 2012 或 7 12 2012 则无论字段显示该月的哪一天 我都需要将公式设置为月底 当然 我们知道并非每个月都会在 30 日或 31 日结束 二月有时会在
  • Spring:与常规的finalize()方法相比,使用spring的生命周期回调“destroy-method”有什么优势吗?

    我理解spring的生命周期回调init method当您需要根据 IoC 框架注入的依赖项进行初始化 而常规方法无法完成 时非常有用contructor方法 但是在生命周期回调中进行清理有什么好处destroy method超过常规fin
  • 将本地存储转换为 Chrome 存储以进行获取和设置

    我有一个用户脚本 我已将其转换为 Chrome 扩展程序 供使用 Chrome 的用户使用 用户脚本设置主题并有可供选择的主题 但仅使用 localStorage 除主子域之外的任何内容都将具有默认主题 我希望使用 Chrome 的存储 A
  • React/redux - 将 actionCreators 传递到多个深度级别

    我想知道其他人如何处理将 redux 动作创建者从智能顶级组件传递到许多较低级别的哑组件而不膨胀其 props 定义 例如 以下这个关于 redux 的优秀教程 http teropa info blog 2015 09 10 full s
  • 在 WordPress 中获取、修改然后打印帖子标题

    wordpress中有没有一种本地方式可以将scentence 的第一个单词的第一个字母变成大写标题 http codex wordpress org Function Reference the title帖子的 如果没有 我该如何在 p
  • Rails - 如何使用 github 上的插件(如何安装、使用等)

    我正在尝试为我的 Rails 3 应用程序安装几个不同的插件 我 cd 到 vendor plugins 然后输入git clone the git src url 我看到 vendor plugins 目录中的文件 但是 当我尝试使用插件
  • 单击链接时停止表行切换

    我想做的是当有人单击表行中的 url 链接时停止切换 document ready function report tr odd addClass odd report tr not odd hide report tr first chi
  • C++ 继承和共享指针

    情况是这样的 假设我们有一个虚拟基类 例如ShapeJuggler 其中包含一个方法 该方法采用指向虚拟基类对象的共享指针 例如Shape 作为参数 让我们跳入以下伪代码来理解 class Shape class ShapeJuggler
  • android: 是否可以将给定的 xml(从 URL)文件下载到磁盘?

    例如 我有一个网址http somedomain com sync login go123 go http somedomain com sync login go123 go它给出了一个 XML 如果你要在 Web 浏览器 我使用 Fir
  • 如何在 Rails 5.x.x 应用程序中以 Zip 格式从 S3 下载多个文件?

    我正在实现允许用户从 S3 下载单个文件或多个文件的功能 单个文件下载工作正常 但对于多个文件 我在 Heroku 上收到错误 Errno ENOENT No such file or directory rb file s lstat 用