Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Slim framework-创建一个将返回可下载文件流的路由_Php_Csv_Slim 3 - Fatal编程技术网

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);

…使文件在通过浏览器访问路由时可用,但我更喜欢返回流,而不是生成并返回物理文件。

有很多方法可以实现这一点。例如:

  • 扩展Slim
    Slim\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');