Rails中使用send_data, send_file 导出csv等文件(一般使用于统计报表等等)

November 25, 2018 16:53
访问量:116
摘要:Rails应用中使用 send_data, send_file 导出csv报表。

前言

  • 使用send_data,send_file时,不能使用swagger api直接访问下载
  • 如果是前后端分离的rails项目,也不能直接通过react,vue调用该接口下载(前端拿不到rails的header), 直接在浏览器中访问rails的该接口才能直接下载csv 使用这种方式掉rails接口window.open(response.file)
  • 这个这方式只适用于rails单应用的项目, 如果非要前端访问下载,需要前端自行构建header

HTTP请求header中会带这些属性

Content-Disposition: attachment; filename="Customer_Statistic.csv"
Content-Transfer-Encoding: binary
Content-Type: application/octet-stream; charset=utf-8

rails中统计导出csv

rails中先定义一个全局的方法 application_controllers:

# 这里的data_arr是个二维数组 [ [], []]
    def data_to_csv(data_arr, header)
      CSV.generate(headers: truedo |csv|
        csv << header

        data_arr.each do |data|
          csv << data
        end
      end
    end

在导出csv的接口中定义:

  # 开门统计
  def enter_statistic
    if params['export_type'] == 'csv'
      parse_array_params(:attributes)
      data = convert_json_to_data_arr("enter")
      header = Array.wrap(params[:attributes]).map{|head| I18n.t("reports.enter_statistics.#{head}")}
      # send_file 是要先在本地创建一个csv文件,第一个参数是路径
      send_data(data_to_csv(data, header), :filename => "Enter_Statistic.csv":type => 'application/octet-stream; charset=utf-8')
    else
      render plain: enter_statistics_json.to_json, status: 200content_type: 'application/json'
    end
  end

当我们访问这个接口的时候如果带了expory_type = ‘csv’ 参数就直接下载,否则为json.

参考文章:

评论

暂无相关评论,快来抢占沙发吧!
评论框离家出走了,点击找回!
昵称
邮箱
网站
昵称
邮箱
网站