zoukankan      html  css  js  c++  java
  • 在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

     

    # ```

  • 相关阅读:
    函数,封装
    c++增强c
    Git安装与使用
    Ajax&Jquery
    IntelliJ Idea2018.2,Pycharm20183.2破解教程
    事务&数据库连接池&DBUtils&JSP设计模式
    JSP&EL&JSTL
    Http协议和Servlet
    接收流信息---字符串
    lucene索引库优化一
  • 原文地址:https://www.cnblogs.com/jicheng1014/p/7051258.html
Copyright © 2011-2022 走看看