图片转换成base64编码问题
图片的保存和传输有些不是很方便,这是可以转成字符串。例如远程下载图片,一般是没有权限操作的。
常用的有两种方案:
- 把远程图片下载到当前服务器,再给当前服务器的图片地址前端下载,下载的是当前服务器的图片,绕过跨源问题;
- 把远程图片转成base64编码格式,传输图片字符串给前端,前端转换成图片。
这里介绍第二种方案。
PHP 实现
<?php
/**
* 把图片转成base64编码
* @param $file string 图片路径
* @return array|string
*/
public function imgToBase64($file)
{
if($fp = fopen($file,"rb", 0)) {
// 获取图片文件大小
$header_array = get_headers($file,true);
$size = $header_array['Content-Length'];
// 获取类型
$img_info = getimagesize($file);
// 类型默认png
$img_type = 'png';
// 判读图片类型
switch ($img_info[2]) {
case 1: $img_type = "gif";
break;
case 2: $img_type = "jpg";
break;
case 3: $img_type = "png";
break;
}
$gambar = fread($fp, $size);
fclose($fp);
$base64Img = chunk_split(base64_encode($gambar));
// 拼上文件类型和格式,解码时有些需要把这两个东西去掉,有些不需要,可以根据自己的场景调整,避免出错
// 测试地址:http://tool.chinaz.com/tools/imgtobase/
$imgContent = 'data:image/' . $img_type . ';base64,' . $base64Img;
return ['imgContent' => $imgContent];
}else{
return '下载图片失败,请重试';
}
}
//************使用************
// 图片路径
$file = '123.png';
$imgContent = $this->imgToBase64($file);
print_r($imgContent);
遇到问题
下面说下我遇到的问题,图片有本地和远程两种情况,有些图片处理函数无法获取远程图片的信息,例如很多教程说的获取图片文件大小的函数
// 获取文件大小
filesize($ImageFile)
我试了下,获取远程的会失败,本地的就行,这里的写法是这种
// 获取图片文件大小
$header_array = get_headers($file,true);
$size = $header_array['Content-Length'];
下面介绍其他的获取远程文件大小的方法,不限于图片
<?php
// 1、第一种,直接抓取文件,计算长度
$file = file_get_contents($url);
echo strlen($file);
// 2、第二种,获取头部的长度参数
$header_array = get_headers($url, true);
$size = $header_array['Content-Length'];
echo $size;
// 3、第三种,使用php curl 来获取远程文件大小
/**
* 获取远程文件大小函数,返回文件大小单位为字节
* @param $file string 图片路径
* @return array|string
*/
function remote_filesize($url, $user = "", $pw = "")
{
ob_start();
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1);
if(!empty($user) && !empty($pw))
{
$headers = array('Authorization: Basic ' . base64_encode("$user:$pw"));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
$ok = curl_exec($ch);
curl_close($ch);
$head = ob_get_contents();
ob_end_clean();
$regex = '/Content-Length:\s([0-9].+?)\s/';
$count = preg_match($regex, $head, $matches);
return isset($matches[1]) ? $matches[1] . " 字节" : "unknown";
}
// 实例测试
echo remote_filesize("http://www.runoob.com/wp-content/themes/runoob/assets/img/runoob-logo@2x.png");