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

     

    # ```

  • 相关阅读:
    平衡的括号[UVA-673]
    Spark GraphX图形数据分析
    Spark sql
    Spark 分布式计算原理
    spark 算子实例
    window scala-2.11.8 安装
    spark 2.3.3 安装
    安装jdk
    Logstash-6.2.2安装和Kibana-6.2.2安装:
    elasticsearch-6.2.2 安装
  • 原文地址:https://www.cnblogs.com/jicheng1014/p/7051258.html
Copyright © 2011-2022 走看看