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

回答編集履歴

1

加筆修正

2019/10/24 10:48

投稿

退会済みユーザー
answer CHANGED
@@ -19,4 +19,42 @@
19
19
  ファイルに書き出す直前に一行分のデータを文字エンコーディングを変えて出力する、
20
20
  なら意味あります。
21
21
 
22
- 以上、ご確認ください。
22
+ 以上、ご確認ください。
23
+
24
+ ---
25
+
26
+ 示されたコードを自分なりに書き換えて動かしてみました。
27
+ 空白2文字が入る現象が再現されず、webサーバーのレスポンスヘッダーにへんな細工がされていたりしないか、
28
+ なんてオカルト的なことを疑いたくもなり。
29
+
30
+ ```php
31
+ <?php
32
+
33
+ $dataList = [];
34
+
35
+ //CSV形式で情報をファイルに出力のための準備
36
+ $csvFileName = __DIR__ . '/tmp' . time() . rand() . '.csv';
37
+ $res = fopen($csvFileName, 'w');
38
+ $array=['あ', 'い'];
39
+ $dataList[] = $array;
40
+ // ループしながら出力
41
+ foreach($dataList as $dataInfo) {
42
+ $line = implode(',' , $dataInfo);
43
+
44
+ // 文字コード変換。エクセルで開けるようにする
45
+ mb_convert_variables('SJIS', 'UTF-8', $line);
46
+
47
+ // ファイルに書き出しをする
48
+ fwrite($res, $line . "\n");
49
+ }
50
+ fclose($res);
51
+
52
+ // ダウンロード開始
53
+ header('Content-Type: application/octet-stream');
54
+
55
+ // ここで渡されるファイルがダウンロード時のファイル名になる
56
+ header('Content-Disposition: attachment; filename=sample.csv');
57
+ header('Content-Transfer-Encoding: binary');
58
+ header('Content-Length: ' . filesize($csvFileName));
59
+ readfile($csvFileName);
60
+ ```