簡単に言うと、CakePHPコントローラーからCSVファイルを生成してダウンロードしようとしています。CSVの生成に問題はなく、応答が4096バイト以上になるまですべてが機能します。
次のコントローラーは問題を示しています。
class TestTypeController extends Controller {
public function csv($size = 100) {
# set the content type
Configure::write('debug', 0);
$this->autoRender = false;
$this->response->type('csv');
# send the response
for ($i = 0; $i < $size; $i++)
echo 'x';
}
}
を呼び出すとhttp://baseurl/test_type/csv/4095
、ファイルを保存するように求められ、Content-Typeヘッダーはtext/csv
です。応答ヘッダーは次のとおりです。
HTTP/1.1 200 OK
Date: Tue, 05 Jun 2012 14:28:56 GMT
Server: Apache/2.2.22 (Ubuntu)
X-Powered-By: PHP/5.3.10-1ubuntu3.1
Content-Length: 4095
Keep-Alive: timeout=5, max=98
Connection: Keep-Alive
Content-Type: text/csv; charset=UTF-8
を呼び出すhttp://baseurl/test_type/csv/4096
と、ファイルが画面に出力され、応答ヘッダーは次のようになります。
HTTP/1.1 200 OK
Date: Tue, 05 Jun 2012 14:28:53 GMT
Server: Apache/2.2.22 (Ubuntu)
X-Powered-By: PHP/5.3.10-1ubuntu3.1
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 38
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html
明らかに、4kBは、Content-Encodingが応答のgzipを開始する制限です。Content-Typeがどのように反応するのかはよくわかりませんが、text/csvのままにしておくことをお勧めします。
RequestHandlerComponent
を使用して応答のタイプを管理する場合にも、同じ問題が発生します。
CakePHP 2.2.0-RC1を使用していますが、安定した2.1.3に問題があることを確認しました。何か案は?正しい方向へのポインタ?