在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("\nstep #{index}, #{step.name}, status= #{step.status}, raw_return_value= #{step.raw_return_value}\n")

        zos.puts(step.log)

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

      end

    end

    tmpfile

  end

 

 

def log_zip

tempfile = @job.log_zip

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

end

 

# ```

posted @ 2017-06-20 00:14  Atpking  阅读(488)  评论(0编辑  收藏  举报