Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为要压缩的每个文件指定一个自定义文件名_Ruby On Rails_Amazon S3 - Fatal编程技术网

Ruby on rails 为要压缩的每个文件指定一个自定义文件名

Ruby on rails 为要压缩的每个文件指定一个自定义文件名,ruby-on-rails,amazon-s3,Ruby On Rails,Amazon S3,我正在从S3下载多个文件并压缩它们。如何为正在压缩的每个文件指定自定义名称 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_

我正在从S3下载多个文件并压缩它们。如何为正在压缩的每个文件指定自定义名称

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

看起来你有两种方法可以做到这一点。对于最终用户来说,这两种方法应该产生相同的结果,这取决于您希望它们在服务器上的方式

1.在将文件压缩到一起时更改它 这将保留系统中当前命名的文件,并且仅在output archive.zip中更改它们

看这个,看起来像

因此,在您的代码中,只需更改

zipfile.add(attachment, File.join(folder_path, attachment))
你想叫什么名字都行

2.将文件写入服务器时对其进行更改 因为您只在上面几行写文件

open(folder_path + "#{attachment.avatar.file.filename}", 'wb') do |file|

您也可以更改此行的文件名。这将更改服务器和存档文件中的文件名。zip

您要用什么名称来代替存档文件。zip??
open(folder_path + "#{attachment.avatar.file.filename}", 'wb') do |file|