从数据库通过PHP流式传输图像时获取标题

时间:2009-11-19 17:54:22

标签: php database streaming

我有一些非常简单的PHP代码,可以从数据库中返回二进制图像数据。

ob_start();

$stmt = $db->prepare($sql);
$stmt->execute(array($ImageID));
$stmt->bindColumn(1, $lob, PDO::PARAM_LOB);
$stmt->fetch(PDO::FETCH_BOUND);

ob_clean();
header("Content-Type: " . $content_type);

fpassthru($lob);

让我们调用这个脚本get_image.php。我从另一个脚本调用此脚本来获取图像数据然后处理它。喜欢这样。

$src = file_get_contents('example.com/get_image.php?ImageID=foo');

$src = imagecreatefromstring($src);
imagecopyresized($newfile, $src, 0, 0, 0, 0, $newwidth, $newheight, $origwidth, $origheight);

我从图像处理功能中收到错误,说“数据不是可识别的格式”。看一下响应后,看起来我的$ src变量包括标题和二进制数据。我一直在做研究,但我无法弄清楚如何摆脱标题输出,只是使用原始二进制字符串。任何帮助表示赞赏。

要清楚,如果我打印出$ src字符串,而不是原始二进制数据,我得到以下内容。

HTTP/1.1 200 OK
Date: Thu, 19 Nov 2009 17:33:01 GMT
Server: Apache/2.2.8 (Unix) ...
X-Powered-By: PHP/5.2.11
Connection: close
Content-Type: image/jpeg

/* Then all the binary data */

2 个答案:

答案 0 :(得分:1)

我不是PHP专家,这可能是真正的解决方案所在(仅获取响应主体,没有标头)但我知道我的HTTP。为此,上面的HTTP请求的标头和正文总是由两个<CR><LF>分隔。您应该能够获取响应,并从那里获取子字符串。示例iDontKnowPhp代码:

$start = $src.positionOf('<CR><LF><CR><LF>')
$stop  = $src.lenght()
$img   = $src.sub($start, $stop)

答案 1 :(得分:1)

看起来PHP fopen流包装器没有剥离标头。而不是file_get_contents而是尝试CURL:

<?php

$ch = curl_init("http://www.example.com/myimagescript.php");

curl_setopt($ch, CURLOPT_HEADER, 0);  // No headers
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);   // grab the content of the file
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);

$contents= curl_exec($ch);
curl_close($ch);


?>