htmlで表示されているtableデータを、ajaxでサーバに送り、php側でShift-jisに変換し、変換データをjQueryでdownloadしようとしています。
php側でShift-jisには変換でき、サーバの指定ディレクトリにはShift-jis変換されたファイルが保存されますが、jQuery側でdownloadしたデータはutf-8のままとなります。
ユーザの環境にファイルを保存したいので、
jQuery側でShift-jisのファイルをdonloadするにはどうしたらいいのでしょう?
php側でShift-jis変換しても、ajaxで持ってくると、UTF-8になってしまうので、悩んでおります。
文字コード変換がよくわからずにgoogleで検索してコードを使用しているため、おかしな部分があるかもしれませんが、有識者の方、どうかお知恵をお貸しください。
jquery側
html
1 $.ajax({ 2 3 url: "{{ url('/result/3/postCSVdownload2') }}/", 4 type: 'post', 5 data : {tabledata:tabledata}, //tabledataは二次元配列 6 }).done(function (response) { 7 var ajax_data = response; 8 var csv_file = "tabledata.csv"; 9 const blob = new Blob([ ajax_data ], { "type" : "text/csv" }) 10 jQuery("<a></a>", {href: window.URL.createObjectURL(blob), 11 download: csv_file, 12 target: "_blank"})[0].click() 13 }).fail(function () { 14 console.log("fail"); 15 });
php側
php
1 public function postCSVdownload2(Request $request) 2 { 3 $tabledata = $request->tabledata; 4 5 //CSV形式に変換 6 $csvFileName = storage_path('app/upload/' . time() .'.csv'); 7 $res = fopen($csvFileName, 'w'); 8 if ($res === FALSE) { 9 throw new Exception('ファイルの書き込みに失敗しました。'); 10 } 11 // ループしながら出力 12 foreach($tabledata as $dataInfo) { 13 // 文字コード変換。エクセルで開けるようにする 14 mb_convert_variables('SJIS', 'UTF-8', $dataInfo); 15 16 // ファイルに書き出しをする 17 fputcsv($res, $dataInfo); 18 } 19 20 // ハンドル閉じる 21 fclose($res); 22 23 // ダウンロード開始 24 header('Content-Type: application/octet-stream'); 25 26 // ここで渡されるファイルがダウンロード時のファイル名になる 27 header('Content-Disposition: attachment; filename=sampaleCsv.csv'); 28 header('Content-Transfer-Encoding: binary'); 29 header('Content-Length: ' . filesize($csvFileName)); 30 readfile($csvFileName); 31 32 return $csvFileName; 33 34 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/25 08:00