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