wangyuman26

 

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 \Think\Upload($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 \Think\Upload($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;
    }

 

分类:

技术点:

相关文章: