Php Slim framework-创建一个将返回可下载文件流的路由
我在Php Slim framework-创建一个将返回可下载文件流的路由,php,csv,slim-3,Php,Csv,Slim 3,我在index.php $app->get('/generatecsv',ShippingCSVGenerator::class':generateShippingCSV') 函数generateShippingCSV()的调用是正确的,但是我想返回一个流,该流应该可以通过JS在任何需要的视图中下载 public function generateShippingCSV() { // ...some code here... // $out = fopen('dispatch.c
index.php
$app->get('/generatecsv',ShippingCSVGenerator::class':generateShippingCSV')代码>
函数generateShippingCSV()
的调用是正确的,但是我想返回一个流,该流应该可以通过JS在任何需要的视图中下载
public function generateShippingCSV()
{
// ...some code here... //
$out = fopen('dispatch.csv', 'w');
foreach ($CSVArray as $fields) {
fputcsv($out, $fields);
}
$stream = new \GuzzleHttp\Psr7\LazyOpenStream('dispatch.csv', 'r');
$response->withBody($stream);
return $response;
}
上面的函数正确地创建了CSV,但是我不想创建文件-我想返回文件流
*编辑*
添加:
return $response->withHeader('Content-Type', 'application/force-download')
->withBody($stream);
…使文件在通过浏览器访问路由时可用,但我更喜欢返回流,而不是生成并返回物理文件。有很多方法可以实现这一点。例如:
扩展SlimSlim\Http\RequestBody
class
<?php
use Slim\Http\RequestBody;
class CsvRequestBody extends RequestBody
{
public writeCsv(array $CSVArray)
{
$this->rewind();
foreach ($CSVArray as $fields) {
fputcsv($this->stream, $fields);
}
}
}
将数据写入php://temp
,将其读入变量,然后将其写入响应体
$out = fopen('php://temp', 'w');
foreach ($CSVArray as $fields) {
fputcsv($out, $fields);
}
rewind($out);
$csvData = stream_get_contents($out);
fclose($out);
$response->getBody()->rewind();
$response->getBody()->write($csvData);
return $response->withHeader('Content-Type', 'application/force-download');
您可以实现自己的流接口
,或者使用
$out = fopen('php://temp', 'w');
foreach ($CSVArray as $fields) {
fputcsv($out, $fields);
}
rewind($out);
$csvData = stream_get_contents($out);
fclose($out);
$response->getBody()->rewind();
$response->getBody()->write($csvData);
return $response->withHeader('Content-Type', 'application/force-download');