【问题标题】:Generating and downloading a CSV - stream does not support seeking (not remote)生成和下载 CSV - 流不支持搜索(非远程)
【发布时间】:2014-02-21 02:08:31
【问题描述】:

我正在尝试让我的代码以 .csv 格式下载文件,我确实管理了它并且它运行良好,除了它包含一个包含 (#Resource ID XX) 的附加字段,这是我不想要的。我做了一些浏览并阅读了许多答案,说应该使用以下代码:

$fp = fopen('php://output', 'w'); 


foreach ($list as $fields) {
    fputcsv($fp, $fields);
} 

rewind($fp);
$output = stream_get_contents($fp);
fclose($fp);

这给了我以下错误:rewind(): stream does not support seeking in /var/www/opencart/admin/model/catalog/upload.php on line 30,据我了解,这通常是因为 fopen 用于外部的东西,我的不是我不相信..所以我不确定是什么问题是吗?

【问题讨论】:

  • 那么你为什么要做rewind()$output = stream_get_contents($fp);?除非你打算用 $outut 做点什么,否则它们是多余的
  • 顺便说一句,php://output 正在将数据发送到输出流(有效地发送到客户端的浏览器,假设它是一个 Web 请求),所以应该被认为是外部的......一旦你开始发送数据到浏览器,怎么调回来改呢?
  • 我稍后使用带有标题的输出来下载文件。另外我认为 php://output 也是外部的,但另一篇文章建议它作为解决我遇到的问题的方法
  • php://output 视为 echo: 的等价物:除非您也使用输出缓冲,否则它将发送到浏览器(用于 Web 请求)。如果需要添加标头,请在之前添加它们将数据发送到php://output,或使用临时文件,或输出缓冲
  • 我认为它缓存了它,我不认为这是一个网络请求

标签: php


【解决方案1】:

根据我的经验,rewind() 不适用于 php://output,但适用于 php://memory

如果您的计划是稍后获取输出以进行强制下载,那么您不需要倒带流;用stream_get_contents() 阅读就足够了

你的最终代码应该是

$fp = fopen('php://output', 'w'); 

foreach ($list as $fields)
{
    fputcsv($fp, $fields);
} 

$output = stream_get_contents($fp);

fclose($fp);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 2011-09-11
    • 2015-05-29
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多