【问题标题】:Rubyzip download attachments without creating the archiveRubyzip 下载附件而不创建存档
【发布时间】:2017-04-08 15:03:38
【问题描述】:

我正在使用rubyziprails 4,我正在尝试使用自定义方法来下载提交表中的所有附件,而无需实际创建 zip 文件。

submissions_controller.rb

  def download
    @submissions = Submission.all

    file = "#{Rails.root}/tmp/archive.zip"

    Zip::ZipFile.open(file, Zip::ZipFile::CREATE) do |zipfile|
      @submissions.each do |filename|
       zipfile.add(file, filename.file.url(:original, false))
      end
    end
   zip_data = File.read(file)
   send_data(zip_data, :type => 'application/zip', :filename => "All submissions")
  end

如何正确设置文件 var。文档说这是档案名称,但我不想创建该物理档案。也许只是作为一个 tmp ?

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/2405921/…
  • 制作tmp文件发送,有什么问题?
  • 我不太清楚该怎么做
  • documentation 可以帮助您。也尝试搜索一些东西,你不是第一个制作这样功能的开发者。
  • 请看我更新的评论。我正在尝试创建该文件并将其作为附件发送,但出现无法访问错误

标签: ruby file ruby-on-rails-4 archive rubyzip


【解决方案1】:

更改您的代码:

def download
  @submissions = Submission.all

  file = "#{Rails.root}/tmp/archive.zip"

  Zip::ZipFile.open(file, Zip::ZipFile::CREATE) do |zipfile|
    @submissions.each do |filename|
      zipfile.add(file, filename.file.url(:original, false))
    end
  end
  send_file(file, :type => 'application/zip', :filename => "All submissions")
end

您应该使用send_file 而不是send_data

【讨论】:

  • 谢谢。我仍然收到访问错误Permission denied @ sys_fail2 -
  • 您应该检查文件夹,并查看文件是否将其保留在tmp 目录中。
  • 我把它改成了/tmp/archive.zip。该文件夹在那里,但我收到一个未找到的错误 -> 没有这样的文件或目录@rb_sysopen - /tmp/archive.zip20161124-11560-1wprn6o。我不确定我在这里做错了什么
  • 文件夹在那里,文件呢?当你得到这个错误时? Permission denied 压缩或发送时?
  • 所以我的文件在我的public/system 文件夹下,我希望它们进入tmp/archive.zip 并发送给用户,然后从那里删除
【解决方案2】:

这是让我的代码 100% 正常工作的正确语法:

# Download zip file of all submission
  def download
    @submissions = Submission.all

    archiveFolder = Rails.root.join('tmp/archive.zip') #Location to save the zip

    # Delte .zip folder if it's already there
    FileUtils.rm_rf(archiveFolder)

    # Open the zipfile
    Zip::ZipFile.open(archiveFolder, Zip::ZipFile::CREATE) do |zipfile|
      @submissions.each do |filename|
        zipfile.add(filename.file_file_name, 'public/files/submissions/files/' + filename.id.to_s + '/original/' + filename.file_file_name)
      end
    end

    # Send the archive as an attachment
    send_file(archiveFolder, :type => 'application/zip', :filename => '2016 Submissions.zip', :disposition => 'attachment')
  end

【讨论】:

    猜你喜欢
    • 2019-10-04
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多