【发布时间】:2016-09-06 14:42:21
【问题描述】:
我想将 CSV 数据上传到 REST API(仅在某个端点处除外 CSV 数据)。
CSV 数据的来源是用户上传的。上传的格式可以是 CVS、ODS 或 XLSX 电子表格数据。
当用户上传 CSV 文件时 - 我只是这样做(简化):
$handle = \fopen($tempFile, 'r');
$client->post('/import', ['body' => $handle]);
这很有效,而且很容易做到。但是,例如,当用户上传 XLSX 时,我目前会遍历第一张表中的行并使用 fputcsv 创建一个资源。
use Box\Spout\Reader\ReaderFactory;
$reader = ReaderFactory::create('xlsx');
$reader->open($tempFile);
$handle = \fopen('php://temp', 'r+');
/** @var $reader \Box\Spout\Reader\XLSX\Reader */
foreach ($reader->getSheetIterator() as $sheet) {
/** @var $sheet \Box\Spout\Reader\XLSX\Sheet */
foreach ($sheet->getRowIterator() as $row) {
\fputcsv($handle, $row);
}
break;
}
$reader->close();
$client->post('/import', ['body' => $handle]);
我正在寻找一种在内存消耗和性能方面优化过程(XLSX 导入)的方法。
guzzle 是否可以在不先使用 fputcsv 创建完整资源的情况下将来自 foreach ($sheet->getRowIterator() as $row) 的请求作为分块请求发送?我希望这是有道理的。也许这甚至都不是优化...
【问题讨论】:
-
这将与 Guzzle 6 一起使用吗?