你想做的事
我想通过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) } 逐行插入数据。
最后我能够生成以下文件:
奖金
起初我尝试了在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