1

簡単に言うと、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に問題があることを確認しました。何か案は?正しい方向へのポインタ?

4

1 に答える 1

3

答えは非常に単純でした。コントローラーはCSVデータをエコーするのではなく返す必要があります。

于 2012-06-06T14:24:22.303 に答える