thinkphp保存网络图片不显示怎么解决

在使用 ThinkPHP 框架开发 Web 应用时,我们会遇到需要保存来自网络的图片的情况。这时,我们通常会使用 PHP 的 file_put_contents() 函数进行保存。但有时候,保存的图片会出现无法显示的问题,这时该怎么解决呢?本文将介绍如何解决 ThinkPHP 保存网络图片无法显示的问题。

1. 问题描述

在使用 ThinkPHP 框架的控制器进行网络图片保存时,所保存的图片在前端页面无法显示,会出现 404 错误。我们来看一下具体的代码:

public function saveImage()

{

// 图片地址

$url = 'https://example.com/image.jpg';

// 获取图片内容

$content = file_get_contents($url);

// 保存图片

$filename = time() . '.jpg';

$path = '/images/' . $filename;

file_put_contents($path, $content);

return $this->success('图片保存成功');

}

上面的代码中,我们通过 file_get_contents() 函数获取图片内容,然后使用 file_put_contents() 函数保存图片。但是,当我们在前端页面上访问这个保存的图片时,会出现 404 错误。

2. 解决方法

针对上述问题,我们可以采取如下解决方法:

2.1 添加 HTTP 头信息

在使用 file_get_contents() 函数获取图片内容时,我们可以添加 HTTP 头信息。例如,我们可以添加 User-Agent 头信息以模拟浏览器请求:

$context = stream_context_create(array(

'http' => array(

'header' => 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:77.0) Gecko/20190101 Firefox/77.0'

)

));

$content = file_get_contents($url, false, $context);

在保存图片时,我们也可以添加 HTTP 头信息。例如,我们可以添加 Content-Type 头信息以指定图片类型:

$type = image_type_to_mime_type(exif_imagetype($path));

header('Content-Type: ' . $type);

file_put_contents($path, $content);

2.2 使用 cURL 库

除了使用 file_get_contents() 函数外,我们也可以使用 PHP 的 cURL 库进行网络图片的获取和保存。使用 cURL 库时,我们可以设置各种请求头信息,从而增加抓取成功的可能性。

// 创建 cURL 句柄

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:77.0) Gecko/20190101 Firefox/77.0');

// 抓取图片内容

$content = curl_exec($ch);

// 保存图片

$filename = time() . '.jpg';

$path = '/images/' . $filename;

file_put_contents($path, $content);

// 关闭 cURL 句柄

curl_close($ch);

return $this->success('图片保存成功');

3. 总结

通过本文的介绍,我们了解了如何解决 ThinkPHP 保存网络图片无法显示的问题。具体而言,我们可以添加 HTTP 头信息以增加抓取成功的可能性;或者使用 cURL 库进行网络图片的获取和保存。无论哪种方式,都可以很好地解决保存图片无法显示的问题。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签