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

質問編集履歴

2

Content-Typeは最終的にこうした。

2015/12/04 06:53

投稿

seagal18
seagal18

スコア32

title CHANGED
File without changes
body CHANGED
@@ -49,7 +49,7 @@
49
49
  stream_filter_append($fp, "encodeFilter");
50
50
 
51
51
  // ダウンロードさせる
52
- header("Content-Type: text/csv");
52
+ header("Content-Type: application/octet-stream");
53
53
  header("Content-Disposition: attachment; filename=".$this->filename);
54
54
 
55
55
  // 検索結果を書き込む

1

解決方法を追記。

2015/12/04 06:53

投稿

seagal18
seagal18

スコア32

title CHANGED
File without changes
body CHANGED
@@ -29,4 +29,67 @@
29
29
 
30
30
  exit;
31
31
  }
32
- ```
32
+ ```
33
+
34
+ ---
35
+
36
+ 解決できましたので、実装を追記しておきます。
37
+
38
+ **修正したメソッド**
39
+ ```PHP
40
+ public function export($results){
41
+ // フィルタを登録
42
+ stream_filter_register("eolFilter", "eol_filter");
43
+ stream_filter_register("encodeFilter", "encode_filter");
44
+
45
+ $fp = fopen('php://output', 'w');
46
+
47
+ // フィルタを開いたストリームに付加する
48
+ stream_filter_append($fp, "eolFilter");
49
+ stream_filter_append($fp, "encodeFilter");
50
+
51
+ // ダウンロードさせる
52
+ header("Content-Type: text/csv");
53
+ header("Content-Disposition: attachment; filename=".$this->filename);
54
+
55
+ // 検索結果を書き込む
56
+ foreach ($results as $data) {
57
+ fputcsv($fp, $data);
58
+ }
59
+
60
+ fclose($fp);
61
+ }
62
+ ```
63
+
64
+ **作成したフィルタクラス**
65
+
66
+ ```PHP
67
+ // 改行コードをPHP_EOLからCR+LFに置換するフィルタ
68
+ class eol_filter extends php_user_filter {
69
+ function filter($in, $out, &$consumed, $closing) {
70
+ while ($bucket = stream_bucket_make_writeable($in)) {
71
+ $bucket->data = str_replace(PHP_EOL, "\r\n", $bucket->data);
72
+ $consumed += $bucket->datalen;
73
+ stream_bucket_append($out, $bucket);
74
+ }
75
+ return PSFS_PASS_ON;
76
+ }
77
+ }
78
+
79
+ // 文字コードをUTF-8からShift-JISに置換するフィルタ
80
+ class encode_filter extends php_user_filter {
81
+ function filter($in, $out, &$consumed, $closing) {
82
+ while ($bucket = stream_bucket_make_writeable($in)) {
83
+ $bucket->data = mb_convert_encoding($bucket->data, 'SJIS-win', 'UTF-8');
84
+ $consumed += $bucket->datalen;
85
+ stream_bucket_append($out, $bucket);
86
+ }
87
+ return PSFS_PASS_ON;
88
+ }
89
+ }
90
+ ```
91
+
92
+ 参考ページ
93
+ - [http://d.hatena.ne.jp/omoon/20110527/1306475827](http://d.hatena.ne.jp/omoon/20110527/1306475827)
94
+ - [http://php.net/manual/ja/function.stream-filter-register.php](http://php.net/manual/ja/function.stream-filter-register.php)
95
+ - [http://php.net/manual/ja/function.stream-filter-append.php](http://php.net/manual/ja/function.stream-filter-append.php)