将图像作为 PHP POST 响应发送到浏览器。

huangapple go评论85阅读模式
英文:

Send image to browser as a PHP post response

问题

所以,我正在使用CURL进行POST请求:

<?php

$url = 'http://url/to/site';

$data = array(
  "tk" => $_GET["tk"]
);

$ch = curl_init($url);
// 设置请求选项
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FAILONERROR, true);

$response = curl_exec($ch);

if (curl_errno($ch)) {
  $response = curl_error($ch);
}

curl_close($ch);
echo $response;

在另一个网站上,我使用tk进行数据库搜索,然后发送响应:

$bs = new lecRed; // lecRed是我之前创建和使用过的一个类

$tk = $_POST["tk"];

$rspta = $bs->searchByTK($tk)->fetchObject(); // 在这里从数据库中检索信息
$arr = array(
  "id"     => $rspta->ide,
  "name"   => $rspta->name,
  "adsc"   => $rspta->adsc,
  "pic"    => $rspta->pic
);

echo "<h1>ID: " . $arr["id"] . "</h1>";
echo "<h1>NAME: " . $arr["name"] . "</h1>";
echo "<h1>ADSC: " . $arr["adsc"] . "</h1>";

到目前为止,一切正常。但现在我想要"echo"图片。我在服务器上有这张图片(与上一个PHP文件相同的路径)。

我尝试了以下代码:

echo "<img src='".$arr["pic"]."' />";

但它没有起作用。我还尝试了以下代码:

$file = 'img/' . $arr["pic"];
$type = 'image/jpeg';
header('Content-Type:' . $type);
header('Content-Length: ' . filesize($file));
readfile($file);

但它只显示了一些奇怪的字符:

将图像作为 PHP POST 响应发送到浏览器。

我尝试了以下代码:

$file = 'img/' . $arr["pic"];

if (file_exists($file)) {
  header('Content-Description: File Transfer');
  header('Content-Type: application/octet-stream');
  header('Content-Disposition: attachment; filename=' . basename($file));
  header('Content-Transfer-Encoding: binary');
  header('Expires: 0');
  header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
  header('Pragma: public');
  header('Content-Length: ' . filesize($file));
  ob_clean();
  flush();
  readfile($file);
  exit;
}

但结果还是一样。

我还尝试使用GD库:

header('content-type: image/jpeg');
$image_file_path = "img/" . $arr["pic"];

switch (pathinfo($image_file_path)['extension']) {
  case 'png':
    $image = imagecreatefrompng($image_file_path);
    break;
  case 'gif':
    $image = imagecreatefromgif($image_file_path);
    break;
  default:
    $image = imagecreatefromjpeg($image_file_path);
}

echo imagejpeg($image);
imagedestroy($image);

但仍然没有起作用。我已经没有其他选择了。有人有任何想法吗?

英文:

So, I'm making a post request with CURL:

&lt;?php

$url = &#39;http://url/to/site&#39;;

$data = array(
  &quot;tk&quot; =&gt; $_GET[&quot;tk&quot;]
);

$ch = curl_init($url);
//seteamos la petici&#243;n
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FAILONERROR, true);

$response = curl_exec($ch);

if (curl_errno($ch)) {
  $response = curl_error($ch);
}

curl_close($ch);
echo $response;

and in the other site I'm doing a database search with the tk, and then sending a response:

$bs = new lecRed; //lecRed it&#39;s a class I created and used before

$tk = $_POST[&quot;tk&quot;];

$rspta = $bs-&gt;searchByTK($tk)-&gt;fetchObject();//here I retrieve the info from the DB
$arr = array(
  &quot;id&quot;      =&gt; $rspta-&gt;ide,
  &quot;name&quot;  =&gt; $rspta-&gt;name,
  &quot;adsc&quot;  =&gt; $rspta-&gt;adsc,
  &quot;pic&quot; =&gt; $rspta-&gt;pic
);

echo &quot;&lt;h1&gt;ID: &quot; . $arr[&quot;id&quot;] . &quot;&lt;/h1&gt;&quot;;
echo &quot;&lt;h1&gt;NAME: &quot; . $arr[&quot;name&quot;] . &quot;&lt;/h1&gt;&quot;;
echo &quot;&lt;h1&gt;ADSC: &quot; . $arr[&quot;adsc&quot;] . &quot;&lt;/h1&gt;&quot;;

So far it is working fine. But now I want to "echo" the image. I have the image in the server (in the same route as the last php file).

I tried doing:

echo &quot;&lt;img src=&#39;&quot;.$arr[&quot;pic&quot;].&quot;&#39; /&gt;&quot;;

but it didn't worked. I also tried:

$file = &#39;img/&#39; . $arr[&quot;pic&quot;];
$type = &#39;image/jpeg&#39;;
header(&#39;Content-Type:&#39; . $type);
header(&#39;Content-Length: &#39; . filesize($file));
readfile($file);

but it only shows this weird characters:

将图像作为 PHP POST 响应发送到浏览器。

I tried this:

$file = &#39;img/&#39; . $arr[&quot;pic&quot;];

if (file_exists($file)) {
  header(&#39;Content-Description: File Transfer&#39;);
  header(&#39;Content-Type: application/octet-stream&#39;);
  header(&#39;Content-Disposition: attachment; filename=&#39; . basename($file));
  header(&#39;Content-Transfer-Encoding: binary&#39;);
  header(&#39;Expires: 0&#39;);
  header(&#39;Cache-Control: must-revalidate, post-check=0, pre-check=0&#39;);
  header(&#39;Pragma: public&#39;);
  header(&#39;Content-Length: &#39; . filesize($file));
  ob_clean();
  flush();
  readfile($file);
  exit;
}

but it's more of the same.

I also tried using de gd library:

header(&#39;content-type: image/jpeg&#39;);
$image_file_path = &quot;img/&quot; . $arr[&quot;pic&quot;];

switch (pathinfo($image_file_path)[&#39;extension&#39;]) {
  case &#39;png&#39;:
    $image = imagecreatefrompng($image_file_path);
    break;
  case &#39;gif&#39;:
    $image = imagecreatefromgif($image_file_path);
    break;
  default:
    $image = imagecreatefromjpeg($image_file_path);
}

echo imagejpeg($image);
imagedestroy($image);

But nothing worked. I ran out of options. Anyone have any idea?

答案1

得分: 2

一种解决方案是使用“数据URL”:<img src="data:..."

https://www.w3docs.com/snippets/html/how-to-display-base64-images-in-html.html

使用Base64编码的图像可以通过使用<img>标签嵌入到HTML中。这可以通过减少浏览器发出的额外HTTP请求来提高较小图像的页面加载时间。

Base64编码和数据URL是相辅相成的,因为数据URL减少了浏览器显示HTML文档所需的HTTP请求数量。

<img>标签具有一个src属性,其中包含图像的数据URL。数据URL由两部分组成,用逗号分隔。第一部分指定了Base64编码的图像,第二部分指定了图像的Base64编码字符串。

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />

此链接提供了几个示例,使用PHP的base64_encode()函数:

英文:

One solution is to use a "Data URL": &lt;img src=&quot;data:...

> https://www.w3docs.com/snippets/html/how-to-display-base64-images-in-html.html
>
> Images encoded with Base64 can be embedded in HTML by using the <img>
> tag. This can help to increase the page load time for smaller images
> by saving the browser from making additional HTTP requests.
>
> Base64 encoding and Data URL go hand-in-hand, as Data URLs reduce the
> number of HTTP requests that are needed for the browser to display an
> HTML document.
>
> The &lt;img&gt; tag has a src attribute and contains the Data URL of the
> image. A Data URL is composed of two parts, which are separated by a
> comma. The first part specifies a Base64 encoded image, and the second
> part specifies the Base64 encoded string of the image.
>
> <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4
> //8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />

This link has several examples, using PHP base64_encode():

huangapple
  • 本文由 发表于 2023年8月9日 02:17:34
  • 转载请务必保留本文链接:https://go.coder-hub.com/76862221.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定