csv 尝试下载流会得到一个内容为“Resourceid #xxx”的文件

z9gpfhce  于 2023-09-27  发布在  其他
关注(0)|答案(1)|浏览(62)

我正在使用Laravel,并试图将数据库中的项目导出到CSV文件。我已经很接近了。不幸的是,我在下载的文件中得到了Process id #xxx的输出。
这是我使用的代码的一个更小的匿名示例。

public function exportCSV(): StreamedResponse
{
    $keys = ['id', 'title'];
    $posts = Post::select($keys)->get();

    $stream = fopen('php://memory', 'w+');
    fputs($stream, "sep=,\n"); // Excel will be nice
    fputcsv($stream, $keys);

    foreach ($posts->toArray() as $post) fputcsv($stream, $post);

    rewind($stream);

    // dd(stream_get_contents($stream)) gives the expected result here
    return response()->streamDownload(function () use ($stream) {
        echo $stream;
    }, 'export.csv');
}
djmepvbi

djmepvbi1#

这是因为在$stream变量中,它只是一个句柄。要从句柄读取数据,需要使用fread函数。

$handle = fopen('php://memory', 'w+');
[..]
$blocksize = 1024;
while (($block = fread($handle, $blocksize)) !== false) {
  echo $block;
}
fclose($handle);

循环是必要的,因为您必须定义要读取的字节数。当到达文件末尾时,fread返回false。
有关更多信息,请参阅PHP文档:https://www.php.net/manual/de/function.fread.php

相关问题