php接口方式上传和接受图片base64

34 篇文章 1 订阅
16 篇文章 0 订阅

1、转化base64图片远程或本地图片,通过接口方式传输

<?php
$path='D:\phpstudy_pro\WWW\test\1.png';
$path='https://static/common/img/icon_cf1b905.png';

$base_64=img_base64($path);
$url="http://localhost/test6.php";
$param=[
    "img"=>$base_64
];
$headers[] = "Content-Type: application/json; charset=utf-8";

$res = http_post($url,json_encode($param),false,$headers,60);
var_dump($res);exit;
 function img_base64($path){
    //对path进行判断,如果是本地文件就二进制读取并base64编码
    $img_data="";
    if (substr($path,0,strlen("http")) === "http"){

        $img_data= n_img_base_64($path);

    }else{
        $img_data=  imgToBase64($path);
    }
    return $img_data;
}
/**
 * @param $img
 * @return string
 * 网络图片转base64
 */
 function n_img_base_64($img){
    $imageInfo = getimagesize($img);
    return 'data:' . $imageInfo['mime'] . ';base64,' . chunk_split(base64_encode(file_get_contents($img)));
}

/**
 * @param $img_file
 * @return string\
 * 本地图片转base64
 */
 function imgToBase64($img_file) {
    $img_base64 = '';
    if (file_exists($img_file)) {
        $app_img_file = $img_file; // 图片路径
        $img_info = getimagesize($app_img_file); // 取得图片的大小,类型等
        $fp = fopen($app_img_file, "r"); // 图片是否可读权限
        if ($fp) {
            $filesize = filesize($app_img_file);
            $content = fread($fp, $filesize);
            $file_content = chunk_split(base64_encode($content)); // base64编码
            switch ($img_info[2]) {           //判读图片类型
                case 1: $img_type = "gif";
                    break;
                case 2: $img_type = "jpg";
                    break;
                case 3: $img_type = "png";
                    break;
            }
            $img_base64 = 'data:image/' . $img_type . ';base64,' . $file_content;//合成图片的base64编码
        }
        fclose($fp);
    }
    return $img_base64; //返回图片的base64
}



/**
 * POST 请求
 * @param string $url
 * @param array $param
 * @param boolean $post_file 是否文件上传
 * @return string content
 */
function http_post($url,$param,$post_file = false,$headers = [],$outTime = 100){
    $oCurl = curl_init();
    if(stripos($url,"https://")!==FALSE){
        curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
    }
    if (is_string($param) || $post_file) {

        $strPOST = $param;

        //exit;
    } else {
        $aPOST = array();
        foreach($param as $key=>$val){
            $aPOST[] = $key."=".urlencode($val);
        }
        $strPOST =  join("&", $aPOST);
    }

    curl_setopt($oCurl, CURLOPT_URL, $url);
    curl_setopt($oCurl, CURLOPT_TIMEOUT, $outTime);

    curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt($oCurl, CURLOPT_POST,true);
    curl_setopt($oCurl, CURLOPT_POSTFIELDS,$strPOST);
    if($headers){
        curl_setopt($oCurl, CURLOPT_HTTPHEADER, $headers);
    }
    $sContent = curl_exec($oCurl);

    $aStatus = curl_getinfo($oCurl);

    if(intval($aStatus["http_code"])==200){
        curl_close($oCurl);
        return $sContent;
    }else{
        $err_code = curl_errno($oCurl);
        if($sContent){
            return  $sContent;
        }
        curl_close($oCurl);

        //exit;
        return false;
    }
}

2、接受图片base64并保存图片

<?php
$data=file_get_contents("php://input");
$result=json_decode($data,true);
$res=saveBase64Image($result['img'],'test');
echo  json_encode($res);



function saveBase64Image($base64_image_content,$fileName)
{

    if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)) {
        //图片后缀
        $type = $result[2];
        if ($type == 'jpeg') {
            $type = 'jpg';
        }
        //保存位置--图片名
        $image_name = $fileName . '-' . date('Ymd') . date('His') . '-' . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT) . "." . $type;
        $Absolute_Path = $_SERVER['SCRIPT_FILENAME'];
        $Absolute_Path = substr($Absolute_Path, 0, -9);

        $root = $_SERVER['DOCUMENT_ROOT'];
        $image_url1 = $root.'/img/'.date('Ymd');
        $image_url =$image_url1.'/'.$image_name;
        $httpHost = $image_url1;

        if(!is_dir(dirname($image_url1))){
            if (!file_exists($image_url1)) {
                mkdir($image_url1, 0777, true);
            }
        }
        //解码
        $decode = base64_decode(str_replace($result[1], '', $base64_image_content));

        if (file_put_contents($image_url, $decode)) {
            $data['code'] = '0';
            $data['imageName'] = $image_name;
            $data['image_url'] = $httpHost;
            $data['type'] = $type;
            $data['msg'] = '保存成功!';
        } else {
            $data['code'] = '1';
            $data['imgageName'] = '';
            $data['image_url'] = '';
            $data['type'] = '';
            $data['msg'] = '图片保存失败!';
        }
    } else {
        $data['code'] = '1';
        $data['imgageName'] = '';
        $data['image_url'] = '';
        $data['type'] = '';
        $data['msg'] = 'base64图片格式有误!';
    }

    return $data;
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
上传图片时,使用Base64编码和二进制流都有各自的优缺点,具体选择哪种方法取决于应用场景和需求: 1. Base64编码: - **优点**: - **易于理解**:Base64编码将图像数据转换为文本形式,便于在URL中直接传输或存储在文本字段中。 - **兼容性**:大部分后端和前端框架都能直接处理Base64数据,无需额外解析步骤。 - **缺点**: - **大小限制**:Base64编码会增加文件的大小,对于大图片可能会导致URL过长,影响用户体验。 - **效率**:相比二进制流,编码和解码过程会消耗更多CPU资源。 2. 二进制流(Binary Stream): - **优点**: - **效率高**:直接使用二进制流可以减少数据传输中的开销,尤其对于大文件,速度更快。 - **占用空间小**:不经过Base64转换,文件大小更接近原始大小。 - **隐私性**:传输的是原始数据,可能更适合对数据隐私有较高要求的场景。 - **缺点**: - **复杂性**:后端和前端处理二进制流可能需要更多的代码,特别是跨平台或跨语言通信时。 - **URL支持**:不是所有的服务器或API都支持直接处理二进制数据,需要额外的上传接口或库支持。 综上所述,如果你关注的是简单性和通用性,并且图片大小适中,Base64可能是较好的选择。如果对性能和数据隐私有更高的要求,或者图片特别大,那么二进制流会更合适。具体使用哪种方式,还需要考虑项目的技术栈、网络条件以及平台支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PHP隔壁老王邻居

啦啦啦啦啦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值