【问题标题】:HTTP Image output gives blob data instead of imageHTTP 图像输出提供 blob 数据而不是图像
【发布时间】:2019-01-26 08:47:57
【问题描述】:

我的网址看起来像 ..../image/view?id=6

导航到这个 url 应该会给出我数据库中的图像。 但目前我收到了一堆奇怪的字符作为回应。

当我输出(见下文)时,我看到了我的图像。

<img src="data:image/jpeg;base64,'.base64_encode( $image->Data ).'"/>

我正在使用这段代码来生成我的 HTTP 响应,但响应只是 blob 数据:

 header('Content-Type :'.$image->Extension);
 header('Content-Disposition: filename='.$image->Name.'.'.$image->Extension);
 header('Content-Length: ' . strlen($image->Data));
 $response->format = Response::FORMAT_RAW;
 $response->data = $image->Data;

当前输出开始于:

����JFIF��>CREATOR: gd-jpeg v1.0 (using IJG JPEG v90), default quality ��C     $.' ",#(7),01444'9=82<.342��C     2!!22222222222222222222222222222222222222222222222222���"��    ���}!1AQa"q2���#B��R��$3br� 

使用的标题:

   Accept-Ranges: bytes
   Cache-Control: private
   Content-Disposition: inline;        filename="FYdsl67l4PWJQ7QFFeo14Ena76gr0pEP.jpg"
   Content-Length: 320135
   Content-Type: image/jpeg
   Date: Mon, 28 Jan 2019 19:05:11 GMT
   Expires: 0
   Pragma: public
   Server: Microsoft-IIS/8.5
   X-Powered-By: PHP/5.6.24, ASP.NET

任何帮助将不胜感激

【问题讨论】:

标签: php mysql http yii2


【解决方案1】:

如果你的图片在进入数据库时​​是base64编码的,要显示它,你要么需要

  1. 使用base64_decode($img) 然后显示它。或
  2. 执行此操作:回显'&lt;img src="data:image/jpeg;base64,' . $image-&gt;Data . '"/&gt;;

你似乎在做的是再次编码。

【讨论】:

  • 您好,数据不是 base64 编码的。当我将数据打印到浏览器时,它的开头是:����JFIF��>CREATOR: gd-jpeg v1.0 (using IJG JPEG v90), default quality ��C $.' ",#(7),01444'9=82<.342>
  • 它有 jpeg 扩展名吗?只是这一张图片还是全部?它在数据库中存储的数据类型是什么?
  • 都是 :(。安装了一个新数据库,并恢复了我以前数据库的备份。一切正常。除了我在数据库中的所有图像和文件都有同样的问题。我'已经向我的数据库添加了一个新图像,但仍然存在同样的问题:(我正在将二进制字符串保存到数据库中,数据库字段的类型为 mediumblob
【解决方案2】:

您应该使用Response::sendContentAsFile() 发送此文件:

return Yii::$app->response->sendContentAsFile(
    $image->Data, 
    $image->Name . '.' . $image->Extension, 
    ['mimeType' => FileHelper::getMimeTypeByExtension($image->Name . '.' . $image->Extension)]
);

请注意,Conent-Type 标头与文件扩展名不同 - 请参阅 FileHelper::getMimeTypeByExtension()

【讨论】:

  • 测试了代码,图像立即下载到我的电脑上。不幸的是,图像似乎“损坏/损坏或太大”。虽然我可以使用 base64 在 img 标签中显示我的图像(但这不是我的首选解决方案)
  • 您确定没有添加过多的标题吗?还是在文件发送前输出?
  • 您好,我已将代码改回原始代码并将标题添加到问题中。数据是一个二进制字符串,在我的中等 blob 类型的数据库中
  • 您有两个 Content-Type 标头。您需要弄清楚Content-Type: text/html; charset=UTF-8 标头的来源。
  • 将我的代码更改为您的示例,但添加了参数'inline' =&gt; true。标题更正确(问题已更新)。但图片在我使用的链接上仍然不可见
【解决方案3】:

问题已解决,看来我的文件编码不正确... 文件需要是 iso 而不是 utf-8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多