質問編集履歴

2

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

2015/12/04 06:53

投稿

seagal18
seagal18

スコア32

test CHANGED
File without changes
test CHANGED
@@ -100,7 +100,7 @@
100
100
 
101
101
  // ダウンロードさせる
102
102
 
103
- header("Content-Type: text/csv");
103
+ header("Content-Type: application/octet-stream");
104
104
 
105
105
  header("Content-Disposition: attachment; filename=".$this->filename);
106
106
 

1

解決方法を追記。

2015/12/04 06:53

投稿

seagal18
seagal18

スコア32

test CHANGED
File without changes
test CHANGED
@@ -61,3 +61,129 @@
61
61
  }
62
62
 
63
63
  ```
64
+
65
+
66
+
67
+ ---
68
+
69
+
70
+
71
+ 解決できましたので、実装を追記しておきます。
72
+
73
+
74
+
75
+ **修正したメソッド**
76
+
77
+ ```PHP
78
+
79
+ public function export($results){
80
+
81
+ // フィルタを登録
82
+
83
+ stream_filter_register("eolFilter", "eol_filter");
84
+
85
+ stream_filter_register("encodeFilter", "encode_filter");
86
+
87
+
88
+
89
+ $fp = fopen('php://output', 'w');
90
+
91
+
92
+
93
+ // フィルタを開いたストリームに付加する
94
+
95
+ stream_filter_append($fp, "eolFilter");
96
+
97
+ stream_filter_append($fp, "encodeFilter");
98
+
99
+
100
+
101
+ // ダウンロードさせる
102
+
103
+ header("Content-Type: text/csv");
104
+
105
+ header("Content-Disposition: attachment; filename=".$this->filename);
106
+
107
+
108
+
109
+ // 検索結果を書き込む
110
+
111
+ foreach ($results as $data) {
112
+
113
+ fputcsv($fp, $data);
114
+
115
+ }
116
+
117
+
118
+
119
+ fclose($fp);
120
+
121
+ }
122
+
123
+ ```
124
+
125
+
126
+
127
+ **作成したフィルタクラス**
128
+
129
+
130
+
131
+ ```PHP
132
+
133
+ // 改行コードをPHP_EOLからCR+LFに置換するフィルタ
134
+
135
+ class eol_filter extends php_user_filter {
136
+
137
+ function filter($in, $out, &$consumed, $closing) {
138
+
139
+ while ($bucket = stream_bucket_make_writeable($in)) {
140
+
141
+ $bucket->data = str_replace(PHP_EOL, "\r\n", $bucket->data);
142
+
143
+ $consumed += $bucket->datalen;
144
+
145
+ stream_bucket_append($out, $bucket);
146
+
147
+ }
148
+
149
+ return PSFS_PASS_ON;
150
+
151
+ }
152
+
153
+ }
154
+
155
+
156
+
157
+ // 文字コードをUTF-8からShift-JISに置換するフィルタ
158
+
159
+ class encode_filter extends php_user_filter {
160
+
161
+ function filter($in, $out, &$consumed, $closing) {
162
+
163
+ while ($bucket = stream_bucket_make_writeable($in)) {
164
+
165
+ $bucket->data = mb_convert_encoding($bucket->data, 'SJIS-win', 'UTF-8');
166
+
167
+ $consumed += $bucket->datalen;
168
+
169
+ stream_bucket_append($out, $bucket);
170
+
171
+ }
172
+
173
+ return PSFS_PASS_ON;
174
+
175
+ }
176
+
177
+ }
178
+
179
+ ```
180
+
181
+
182
+
183
+ 参考ページ
184
+
185
+ - [http://d.hatena.ne.jp/omoon/20110527/1306475827](http://d.hatena.ne.jp/omoon/20110527/1306475827)
186
+
187
+ - [http://php.net/manual/ja/function.stream-filter-register.php](http://php.net/manual/ja/function.stream-filter-register.php)
188
+
189
+ - [http://php.net/manual/ja/function.stream-filter-append.php](http://php.net/manual/ja/function.stream-filter-append.php)