在rails 中返回 zip 文件
Posted ATPKING
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在rails 中返回 zip 文件相关的知识,希望对你有一定的参考价值。
在平日的开发当中我们一般只返回html,json 等等,但是偶尔情况下也会使用到其他文件的返回,比如 pdf ,csv 文件
今天在开发中使用的是将大量的文字返回给用户。
## 知识点
- `Tempfile`
- `send_file`
- `gem rubyzip`
### Tempfile
Tempfile 用来生成一个临时文件,它跟File 本身没太大区别,但是他有两个重要的特点:
- 名称是唯一的
- 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
# ```
以上是关于在rails 中返回 zip 文件的主要内容,如果未能解决你的问题,请参考以下文章
带有回形针 Docx content_type 的 Rails 以 application/zip 的形式返回