Symfony: Export (CSV) File has limit?



我正在尝试使用Symfony 5发送生成的CSV文件,但不知何故似乎已经达到了我无法克服的限制。 出于测试原因,我将其分解为基础知识的基础;所以我发送静态数据,生成一个 txt 文件并且不做任何逻辑。在下面的示例代码中,如果我进行 65 次迭代,则会生成文件并将其作为下载发送到浏览器(即 4KB(。如果我执行 66 或向$data示例数据字符串添加一个字母,则它们都显示在浏览器窗口中。 完全相同的代码在Symfony之外运行良好,即使有1000次迭代。我也没有从开发中得到错误或任何内容.log这可能会有所帮助。

public function saveCSV(Request $request, DelcampeParser $parser) {
$response = new Response();
// same with
//  $response = new StreamedResponse();
//  $response->setCallback(function(){});
$response->headers->set('Content-Type', 'text/plain; charset=utf-8');
$disposition = HeaderUtils::makeDisposition(
HeaderUtils::DISPOSITION_ATTACHMENT,
'foo.txt'
);
$response->headers->set('Content-Disposition', $disposition);
$data = array(0 => 'abcdefghijklmnopqrstuvwxyz');
for ($a=1;$a<=66;$a++) {
var_dump($data);
}
return $response;
}

怎么了?为什么我无法在Symfony中生成更大的文件?

谢谢。

[编辑] 我有一个新的理论:PHP 的输出缓冲设置为 4KB。每当缓冲区已满时,缓冲的数据就会发送到浏览器。不幸的是,这发生在Symfony发送标头之前,从而生成浏览器输出。如何更改该行为?

我现在对StreamedResponse有一个有效的答案,希望也能满足Symfony的所有要求和建议:

// in the Controller
public function saveCSV(Request $request, Parser $parser) {
$response = new StreamedResponse();
$data = $request->get("sd");    // sd comes out of a form that posts a multidimensional array
$response->setCallback(function() use ($data, $parser) {
$parser->generateCSV($data);
});
$response->headers->set('Content-Type', 'text/csv; charset=utf-8');
$disposition = HeaderUtils::makeDisposition(
HeaderUtils::DISPOSITION_ATTACHMENT,
"delcampeimport_".date("Ymd-Hi").".csv",
);
$response->headers->set('Content-Disposition', $disposition);
return $response;
}

和我的服务

public function generateCSV($dataarray) {
$out = fopen('php://output', 'w+');
// send header rows of csv file
fputs($out, "website_visibility,category_id,title, /* ..., */ imagesrn");
// generate data
foreach($dataarray AS $stamp) {
$stampdata = array ( 
'a' => 'CH',
'b' => $stamp['category'],
'c' => htmlentities($stamp['title']),
// ...
'aa' => $stamp['img1'].
($stamp['img2'] ? ";".$stamp['img2']:"").
($stamp['img3'] ? ";".$stamp['img3']:"")
);
// send csv data
fputcsv($out, $stampdata);
}
fclose($out);
}

感谢您的输入

相关内容

最新更新