zoukankan      html  css  js  c++  java
  • PHP 图片上传 (AIP图片上传接口)

    PHP上传的简单案例:  

    Html文件:

    <html>
    
    <form action="index.php" name="form" method="post" enctype="multipart/form-data">
        <input type="file" name="file" />
        <input type="submit" name="submit" value="上传" />
    </form>
    
    </html>

    样式相关:

      手机端,点击上传按钮,弹出相机:

        <input type="file" accept="image/*;capture=camera">直接调用相机
                <input type="file" accept="image/*" />调用相机 图片或者相册

    PHP文件:

    <?php
    
    $file = $_FILES['file'];//得到传输的数据
    
    //得到文件名称
    $name = $file['name'];
    $type = strtolower(substr($name,strrpos($name,'.')+1)); //得到文件类型,并且都转化成小写
    $allow_type = array('jpg','jpeg','gif','png'); //定义允许上传的类型
    //判断文件类型是否被允许上传
    if(!in_array($type, $allow_type)){
        //如果不被允许,则直接停止程序运行
        return ;
    }
    //判断是否是通过HTTP POST上传的
    if(!is_uploaded_file($file['tmp_name'])){
        //如果不是通过HTTP POST上传的
        return ;
    }
    $upload_path = "./img/"; //上传文件的存放路径
    //开始移动文件到相应的文件夹
    if(move_uploaded_file($file['tmp_name'],$upload_path.$file['name'])){
        echo "Successfully!";
    }else{
        echo "Failed!";
    }
    
    ?>

    使用thinkphp上传类上传的简单案例:

        // 上传配置信息
        protected $upconfig = array(
            'maxSize'    =>    3145728,         // 3M
            'exts'       =>    array('jpg', 'gif', 'png', 'jpeg'),
            'rootPath'   =>    './Public/Uploads/info/',
            'savePath'   =>    '',                          // => 上传子目录需要每个函数自己去设置
            'saveName'   =>    array('uniqid',''),
            'autoSub'    =>    false,                       // 关闭子目录保存
            'subName'    =>    array('date','Ymd'),
        );
    
        protected function upload($file) {
    
            $res['result'] = 1;
            $res['imgurl'] = '';
            $res['msg'] = '';
    
            do {
    
                $ret = true;
           //判断路径是否存在
    $fullPath = $this->upconfig['rootPath'] . $this->upconfig['savePath']; if(!file_exists($fullPath)){
    //如果不存在,创建文件夹
    $ret = mkdir($fullPath, 0777, true); } if(!$ret) { // 上传错误提示错误信息 $res['result'] = 0; $res['msg'] = "创建保存图片的路径失败!"; break; } // 实例化上传类 $upload = new ThinkUpload($this->upconfig); // 上传单个文件 $info = $upload->uploadOne($file);

           // 上传多个文件  
           $info = $upload->upload();

    if(!$info) { // 上传错误提示错误信息 $res['result'] = 0; $res['msg'] = $upload->getError(); } else { // 上传成功 获取上传文件信息 $imgurl = $this->upconfig['rootPath'] . $info['savepath'].$info['savename']; $imgurl = str_replace('./', '/', $imgurl); $res['result'] = 1; $res['imgurl'] = $imgurl; } } while(0); return $res; } // 保存上传的文件 $res = $this->upload($_FILES['attorney']);

    移动端App上传图片实例:API接口:

    问题:APP上传头像,php作为API端应该如何接收图片信息?

    上传部分的代码不是问题,主要是server端如何才能接收到APP端的图片信息。在B/S架构下,可以直接通过form表单设置enctype="multipart/form-data",$_FILES数组中就有了图片信息。那么在C/S模式中,也是如此吗?

     解答1(见方式一)一般是采用二进制流传输,客户端传的是二进制,服务器端接收,然后file_put_contents写入文件就可以了。文件名格式,文件放哪里,这些自己定义。

     解答2(见方式二):Android或者IOS客户端模拟一个HTTP的Post请求到服务器端,服务器端接收相应的Post请求后(通过$_FILES获取图片资源),返回响应信息给给客户端。(这一种方式和获取Html方式提交的方法一样)

    方式一:把图片进行base64加密成字符串,进行传输

    说明:IOS或者安卓端:通过把图片进行base64编码得到字符串,传给接口

            接口端:把接收的字符串进行base64解码,再通过file_put_contents函数,上传到指定的位置

        /**
         * 图片上传
         * @param $imginfo - 图片的资源,数组类型。['图片类型','图片大小','图片进行base64加密后的字符串']
         * @param $companyid - 公司id
         * @return mixed
         */
        public function uploadImage( $imginfo , $companyid ) {
            $image_type = strip_tags($imginfo[0]);  //图片类型
            $image_size = intval($imginfo[1]);  //图片大小
            $image_base64_content = strip_tags($imginfo[2]); //图片进行base64编码后的字符串
    
            $upload = new UploaderService();
            $upconfig = $upload->upconfig;
    
            if(($image_size > $upconfig['maxSize']) || ($image_size == 0)) {
                $array['status'] = 13;
                $array['comment'] = "图片大小不符合要求!";
                return $array;
            }
    
            if(!in_array($image_type,$upconfig['exts'])) {
                $array['status'] = 14;
                $array['comment'] = "图片格式不符合要求!";
                return $array;
            }
    
            // 设置附件上传子目录
            $savePath = 'bus/group/' . $companyid . '/';
            $upload->upconfig['savePath'] = $savePath;
    
            //图片保存的名称
            $new_imgname = uniqid().mt_rand(100,999).'.'.$image_type;
    
            //base64解码后的图片字符串
            $string_image_content = base64_decode($image_base64_content);
    
            // 保存上传的文件
            $array = $upload->upload($string_image_content,$new_imgname);
    
            return $array;
        }
        // 上传配置信息
        public $upconfig = array(
            'maxSize'    =>    3145728,         //3145728B(字节) = 3M
            'exts'       =>    array('jpg', 'gif', 'png', 'jpeg'),
    //        'rootPath'   =>    './Public/Uploads/info/',
            'rootPath'   =>    'https://www.eyuebus.com/Public/Uploads/info/',
        );
    
        /**
         * @param $string_image_content - 所要上传图片的字符串资源
         * @param $new_imgname - 图片的名称,如:57c14e197e2d1744.jpg
         * @return mixed
         */
        public function upload($string_image_content,$new_imgname) {
    
            $res['result'] = 1;
            $res['imgurl'] = '';
            $res['comment'] = '';
    
            do {
                $ret = true;
                $fullPath = $this->upconfig['rootPath'] . $this->upconfig['savePath'];
                if(!file_exists($fullPath)){
                    $ret = mkdir($fullPath, 0777, true);
                }
                if(!$ret) {
                    // 上传错误提示错误信息
                    $res['result'] = 12;
                    $res['comment'] = "创建保存图片的路径失败!";
                    return $res;
                    break;
                }
    
                //开始上传
                if (file_put_contents($fullPath.$new_imgname, $string_image_content)){
                    // 上传成功 获取上传文件信息
                    $res['result'] = 0;
                    $res['comment'] = "上传成功!";
                    $res['imgname'] = $new_imgname;
                }else {
                    // 上传错误提示错误信息
                    $res['result'] = 11;
                    $res['comment'] = "上传失败!";
                }
    
    
            } while(0);
    
            return $res;
        }

    方式二:Android或者IOS客户端模拟一个HTTP的Post请求到服务器端,服务器端接收相应的Post请求后(通过$_FILES获取图片资源),返回响应信息给给客户端。(这一种方式和获取Html方式提交的方法一样)

    移动端需要请求一个URL,这个URL接收POST过去的数据,比如:http://www.apixxx.net/Home/Uploader/uploadPrepare

        public function uploadPrepare() {
            $array = array();
    
            $post_log = print_r($_POST, true);
            Log::record($post_log, 'DEBUG');
            $file_log = print_r($_FILES, true);
            Log::record($file_log, 'DEBUG');
    
    
            $token = $_POST['token'];
    
            $token_str          = jwt_decode($token);
    $user_type          = $token_str['user_type'];
    
    
            // 设置附件上传子目录
            if($user_type == 1) {
                $savePath = 'travel/group/' . $user_companyid . '/';
            }elseif ($user_type == 2) {
                $savePath = 'bus/group/' . $user_companyid . '/';
            }elseif ($user_type == 3) {
                $savePath = 'driver/group/' . $user_companyid . '/';
            }else {
                $array['status'] = 3;
                $array['comment'] = '非法用户!';
                return $array;
            }
            $this->upconfig['savePath'] = $savePath;
    
    
            // 保存上传的文件(单张)
    //        $res = $this->upload($_FILES['file']);
    
        
            // 保存上传的文件(多张) 移动端的表单name=“xxx[]”,支持多张图片
            $res = $this->upload();
    
            $array['status'] = $res['status'];
            $array['comment'] = $res['comment'];
            $array['responseParameters']['img_url'] = $res['img_url'];
    
            echo json_encode($array);
        }
    
    
    
        protected function upload() {
    
            $res['status'] = 1;
            $res['imgurl'] = '';
            $res['comment'] = '';
    
            do {
    
                $ret = true;
                $fullPath = $this->upconfig['rootPath'] . $this->upconfig['savePath'];
                if(!file_exists($fullPath)){
                    $ret = mkdir($fullPath, 0777, true);
                }
                if(!$ret) {
                    // 上传错误提示错误信息
                    $res['status'] = 1;
                    $res['comment'] = "创建保存图片的路径失败!";
                    break;
                }
    
                // 实例化上传类
                $upload = new ThinkUpload($this->upconfig);
    
    //            // 上传单个文件
    //            $info = $upload->uploadOne($file);
    
                // 上传多个文件
                $infos = $upload->upload();
    
                // 上传的图片数量
                $file_count = 0;
                foreach ($_FILES as $file_k => $file_v) {
                    foreach ($file_v["size"] as $k => $v) {
                        if($v == 0) {
                            continue;
                        }
                        $file_count += 1;
                    }
                }
    
                Log::record("info_log", 'DEBUG');
                $info_log = print_r($infos,true);
                Log::record($info_log, 'DEBUG');
    
                if(!$infos) {
                    // 上传错误提示错误信息
                    $res['status'] = 2;
                    $res['comment'] = $upload->getError();
                } else {
                    // 获取的上传成功的图片数量
                    $info_count = 0;
    
                    // 上传成功 获取上传文件信息
                    foreach($infos as $k => $v) {
                        $imgurl[$v['key']][] =  str_replace('./', '/', $this->upconfig['rootPath'] . $v['savepath'].$v['savename']);
                        $info_count += 1;
                    }
    
                    if($file_count != $info_count) {
                        $res['status'] = 1;
                        $res['comment'] = "上传失败!上传的多张图片,没有全部上传成功";
                    }else {
                        $res['status'] = 0;
                        $res['comment'] = "上传成功!";
                        $res['img_url'] = $imgurl;
                    }
                }
    
            } while(0);
    
            return $res;
        }
  • 相关阅读:
    现代C语言程序设计之数据存储
    Linux系统运维与架构设计之文件管理
    Linux系统运维与架构设计之系统基本使用
    Linux系统运维与架构设计之搭建运维环境
    Linux系统运维与架构设计之Linux概述
    Linux系统运维与架构设计技术栈
    架构师成长之道-C语言基础之C语言概述
    K3/Cloud树形单据体的rowId赋值
    K3违反内码唯一键约束
    K3修改字段名
  • 原文地址:https://www.cnblogs.com/wangyuman26/p/5814411.html
Copyright © 2011-2022 走看看