当响应很大(> 4kB)时,在CakePHP中设置Content-Type

时间:2012-06-05 14:47:41

标签: cakephp cakephp-2.1 content-encoding

很简单,我正在尝试从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开始gzipping响应的限制。我不熟悉Content-Type的反应意义,但我显然希望它保持 text / csv

使用RequestHandlerComponent管理响应类型时会出现同样的问题。

我正在使用CakePHP 2.2.0-RC1,但我已经验证了稳定2.1.3存在的问题。有任何想法吗?指针朝正确的方向发展?

1 个答案:

答案 0 :(得分:3)

答案很简单 - 控制器应该返回CSV数据而不是回显它。