teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

実装PGを一部変更したものを追記

2018/01/16 05:58

投稿

taiyo-2017
taiyo-2017

スコア49

answer CHANGED
@@ -1,1 +1,107 @@
1
- 自己解決ではありませんが、参考のためにPGを記載させていただきます。
1
+ 自己解決ではありませんが、参考のために参考PGを記載させていただきます。
2
+
3
+ ctp
4
+ ---
5
+ ```ここに言語を入力
6
+ <?=$this->Form->create(null, ['type' => 'file','url' => ['action' => 'check_csv'],'onsubmit' => 'return false;', 'name' =>'myform', 'id' =>'myform', 'enctype' => 'multipart/form-data' ])?>
7
+ <input id="filReadDep" name="filReadDep" type="file" value="" onChange="chgReadDep()" class="DisplayNone"/>
8
+ <button class="btnMa mt5px" onClick="imgReadDep()"><?= $this->Html->image("buttons_ma1.png", $ma1_options)?></button>
9
+ <?= $this->Form->end(); ?>
10
+ <input id="hoge" type="hidden" value="hoge">
11
+ ```
12
+ js
13
+ ---
14
+ ```ここに言語を入力
15
+ /* ボタンをクリックした際にファイル選択ダイアログを表示 */
16
+ function imgReadDep() {
17
+ document.getElementById("filReadDep").value = "";
18
+ document.getElementById("filReadDep").click();
19
+ }
20
+
21
+ /* ファイルを選択した際にファイルを読み込み */
22
+ function chgReadDep() {
23
+ var fd = new FormData();
24
+ if ($("input[name='filReadDep']").val() !== '') {
25
+ fd.append("file", $("input[name='filReadDep']").prop("files")[0]); // 選択したファイル
26
+ }
27
+ fd.append("dir", $("#hoge").val()); // パラメータを追加
28
+ // for(item of fd) console.log(item); // データ内容を確認できる
29
+ var postData = {
30
+ type : "POST",
31
+ url : $('#test').text(), // action(今回は「check_csv」)が格納されている
32
+ data : fd,
33
+ dataType : 'json',
34
+ processData : false,
35
+ contentType : false
36
+ };
37
+ $.ajax(postData).done(function(data) {
38
+ if (data.check) {
39
+ if (data.result) {
40
+ // 処理
41
+ }
42
+ if (!window.confirm("ファイルの内容を登録します。よろしいですか?")) {
43
+ alert("登録がキャンセルされました。");
44
+ return;
45
+ }
46
+ alert("登録しました。");
47
+ } else {
48
+ alert(data.message); // エラーメッセージ
49
+ return;
50
+ }
51
+ }).fail(function(data) {
52
+ alert("読み込み処理に失敗しました。");
53
+ }).always(function(data) {
54
+ });
55
+ }
56
+ ```
57
+ Controller
58
+ ---
59
+ ```ここに言語を入力
60
+ public function checkCsv(...$path)
61
+ {
62
+ $select_table = $_POST["dir"];
63
+
64
+ $result = [
65
+ "check" => false,
66
+ "result" => false,
67
+ "message" => ""
68
+ ];
69
+ // ファイルパスチェック
70
+ if (empty($_FILES["file"]["tmp_name"])) {
71
+ $result["message"] = "ファイルが読み込めませんでした。";
72
+ $this->autoRender = false;
73
+ echo json_encode($result);
74
+ }
75
+
76
+ // 拡張子チェック
77
+ $fileNm = $_FILES["file"]["name"];
78
+ $tmpAry = explode('.', $fileNm);
79
+ $extension = $tmpAry[count($tmpAry) - 1];
80
+
81
+ if ($extension != 'csv') {
82
+ $result["message"] = "拡張子がCSVではありません。";
83
+ $this->autoRender = false;
84
+ echo json_encode($result);
85
+ }
86
+
87
+ // CSVファイルを配列に保存
88
+ $tmp = fopen($_FILES["file"]["tmp_name"], "r");
89
+ while ($csv[] = fgetcsv($tmp, "1024")) {}
90
+ // 配列 $csv の文字コードをSJIS-winからUTF-8に変換
91
+ mb_convert_variables("UTF-8", "SJIS-win", $csv);
92
+
93
+ // csv内容チェック
94
+ // csvの1列目1項目目を判断
95
+ if($csv[0][0] == "aaa"){
96
+ // 処理
97
+ }
98
+ // csvの1列目2項目目を判断
99
+ if($csv[0][1] == "bbb"){
100
+ // 処理
101
+ }
102
+ // その他の処理
103
+
104
+ $this->autoRender = false;
105
+ echo json_encode($result);
106
+ }
107
+ ```