你想做的事

我想通过POST传输实现CSV文件下载功能。

由于可以从浏览器中检索 CSV 文件,因此最好从浏览器的 HTML 中执行操作并将 CSV 数据返回给浏览器。此外,从安全的角度来看,生成 CSV 文件所需的数据应该从服务器端(控制器端)的数据库中提取。

方法
①通过get访问读取和下载xxx.csvファイル(需要指定CSV格式的返回文件。)
↑是google的好方法
(2) 浏览器接收到来自form 的HTML 形式的POST 响应并下载。

添加到现有代码时,我选择了②,因为它似乎是最漂亮的实现。

整体的一般流程

・将生成CSV文件的条件发送至form
・根据controller收到的条件准备必要的数据
・准备CSV文件并写入
・将写入的CSV文件返回给浏览器端

实施细节

查看侧
formヘルパー使用rails,但是发送方式是javascript
* 数据不返回到浏览器f.submit

对于form,设置生成CSV文件的条件。

<%= form_with url: csv_download_path, method: :post, class: 'js-CsvDownload' do |f| %>
  <%= f.text_field :evaluation_staff %> # 評価するスタッフ
  <%= f.text_field :staff %>            # タスクを実行するスタッフ
  <%= f.date_select :from_date %>       # 着手日
  <%= f.date_select :to_date %>         # 完了日
  <button onclick="submitCsvData()">csvでダウンロード</button>
<% end %>

<script>
    // ajaxレスポンスを取得してダウンロードする
    function submitCsvData() {
        // 送信
        $('.js-CsvDownload').submit();
    }
</script>

控制器端
send_data文档如中所写,可以在不创建erbファイルview 的情况下向浏览器端返回数据。

此外,下载的文件是要在 Excel 中打开的,所以 encoding: Encoding::SJIS 编码了 Excel 也可以解释的 Shift-JIS

def generate_csv
    # csvファイルで使うデータを作成
    # 2次元配列を用意 [[1行目], [2行目], ... [n行目]]
    table_data = create_csv_data(csv_download_params)

    # csvファイルのデータをセット
    csv_data = CSV.generate(row_sep: "
", encoding: Encoding::SJIS) do |csv|
      table_data.each { |data| csv.add_row(data) }
    end

    # ブラウザにデータ送信
    send_data(csv_data,
              disposition: 'attachment',
              filename: 'タスク管理シート.csv',
              type: :csv)
  end

def create_csv_data(csv_download_params)
  # 略
end

CSV.generate 是一种标准方法rails,它将给定的数据作为CSVオブジェクト 传递给块。然后您可以在块内向CSVオブジェクト 添加一行。

数据是如下图的二维数组,我会尽量为CSVデータ的每一行准备必要的数据。
* 我将省略数据整形。

  [
    ['名前', '', '', '', '', ''],
    ['山田太郎', '', '', '', '', '' ],
    ['', '', '', '', '', '' ],
    ['着手日', '完了日', '担当者', '内容', '備考', '確認者' ],
    ['2022/10/01', '2022/12/01', 'rails太郎', 'railsの勉強をする', '特になし', 'rails鈴木' ],
  ]

之后,使用上面提到的table_data.each { |data| csv.add_row(data) } 逐行插入数据。

最后我能够生成以下文件:
【Rails】POST送信でCSVファイルをダウンロード

奖金

起初我尝试了在javascript 内发送数据的方法,如下所示。
但是,即使可以将数据发送到controller,但最终的数据返回目的地是javascript,所以下载并不顺利。


  $(function () {
      $(".js-click-csvDownload").on("click", function () {
          $.ajax({
              url: <%= @csv_generate_url %>,
              type: 'POST',
              processData: false,
              contentType: false,
              data: <%= @data.to_json %>,
              dataType: 'json'
          })
      })
  });

[Ruby on Rails] [JavaScript] 无法下载静态文件。
我在参考时到达了当前内容。

在最后

感谢您观看这么远。
有很多不明白的地方,所以
如果有任何错误,如果您能指出它们,我将不胜感激 m(__)m。


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308631389.html

相关文章: