在rails 中返回 zip 文件

在平日的开发当中我们一般只返回html,json 等等,但是偶尔情况下也会使用到其他文件的返回,比如 pdf ,csv 文件

今天在开发中使用的是将大量的文字返回给用户。

## 知识点

  • `Tempfile`
  • `send_file`
  • `gem rubyzip`

### Tempfile

Tempfile 用来生成一个临时文件,它跟File 本身没太大区别,但是他有两个重要的特点:

  1. 名称是唯一的
  2. GC 垃圾回收,或者ruby退出时会回收这个文件

虽然在实例化一个Tempfile的时候可以传入一个参数似乎是名称,但是实际上实际的文件名称仍然是独立的

```

2.3.1 :005 > Tempfile.new("test.txt")

 => #<Tempfile:/var/folders/_1/dczj199j5l592444zh5d3kg40000gn/T/test.txt20170619-1825-1ry2hp2>

```

我们退出pry,cat 这个路径,是找不到这个文件的  因为被回收了

### send_file

send_file 是 ActionController::DataStreaming module 里的一个方法,可以类似的堪称是render 接收两个参数, file_name 和 options, 我们可以通过options  来将这个文件重命名

同时 send_file 会根据文件的扩展名去调整 response header 的类型,非常方便

### gem rubyzip

这是个zip gem 包,可以读zip zip,今天我使用的是一个简单的功能,将 字符串压到zip当中。注意以下,在使用的时候  需要 include Zip

知识点说完,那看下最后的代码

```

# 业务模型

  def log_zip

    tmpfile = Tempfile.new("job_log.txt")

 

    OutputStream.open(tmpfile) do |zos|

      zos.put_next_entry 'log.txt'

      zos.puts 'Hello world'

 

      sorted_job_steps.each_with_index do |step, index|

        zos.puts("*" * 40)

        zos.puts(" step #{index}, #{step.name}, status= #{step.status}, raw_return_value= #{step.raw_return_value} ")

        zos.puts(step.log)

        zos.puts(" " + "=" * 40 + " ")

      end

    end

    tmpfile

  end

 

 

def log_zip

tempfile = @job.log_zip

send_file tempfile.path, filename: "job_log.zip"

end

 

# ```

原文地址:https://www.cnblogs.com/jicheng1014/p/7051258.html