为每个正在压缩的文件提供自定义文件名

时间:2017-07-06 05:27:00

标签: 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_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 个答案:

答案 0 :(得分:1)

看起来你有两种方法可以做到这一点。对于最终用户,这两者都应该产生相同的结果,只取决于您在服务器上的需求。

1。在将文件压缩到一起时更改它

这将保留当前在系统上命名的文件,并仅在输出archive.zip

中更改它们。

看着这个gem,它看起来像是

Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
  input_filenames.each do |filename|
    # Two arguments:
    # - The name of the file as it will appear in the archive
    # - The original file, including the path to find it
    zipfile.add(filename, folder + '/' + filename)
  end
  zipfile.get_output_stream("myFile") { |os| os.write "myFile contains just this" }
end

因此,在您的代码中只需更改第一次出现的&#39;附件&#39;上

zipfile.add(attachment, File.join(folder_path, attachment))

任何你想要的名字。

2。在将文件写入服务器时更改它

由于您正在将文件写在上面几行

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

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

中的文件名