PHP à propos de l'interface de téléchargement d'images AIP

小云云
Libérer: 2023-03-21 08:00:01
original
4174 Les gens l'ont consulté

Cas simple d'upload PHP :

Fichier 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>
Copier après la connexion

Style lié :

Sur le téléphone mobile, cliquez sur le bouton de téléchargement et la caméra apparaîtra :

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

Un cas simple de téléchargement en utilisant Classe de téléchargement thinkphp :

<?php$file = $_FILES[&#39;file&#39;];//得到传输的数据

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

Version mobile Exemple d'application téléchargeant des images : Interface API :
    
      = &#39;maxSize&#39;    =>    3145728,         
        &#39;exts&#39;       =>    (&#39;jpg&#39;, &#39;gif&#39;, &#39;png&#39;, &#39;jpeg&#39;),
        &#39;rootPath&#39;   =>    &#39;./Public/Uploads/info/&#39;,
        &#39;savePath&#39;   =>    &#39;&#39;,                          
        &#39;saveName&#39;   =>    (&#39;uniqid&#39;,&#39;&#39;),
        &#39;autoSub&#39;    =>    ,                       
        &#39;subName&#39;    =>    (&#39;date&#39;,&#39;Ymd&#39;),  upload([&#39;result&#39;] = 1[&#39;imgurl&#39;] = &#39;&#39;[&#39;msg&#39;] = &#39;&#39; =  = ->upconfig[&#39;rootPath&#39;] . ->upconfig[&#39;savePath&#39;(!( = (, 0777, (!
                [&#39;result&#39;] = 0[&#39;msg&#39;] = "创建保存图片的路径失败!"
             =  \Think\Upload(->
Copier après la connexion
(!
                [&#39;result&#39;] = 0[&#39;msg&#39;] = ->
                 =  ->upconfig[&#39;rootPath&#39;] . [&#39;savepath&#39;].[&#39;savename&#39; = (&#39;./&#39;, &#39;/&#39;, [&#39;result&#39;] = 1[&#39;imgurl&#39;] = (0 
         = ->upload([&#39;attorney&#39;]);
Copier après la connexion

Question : L'application télécharge un avatar, comment PHP, en tant qu'API, doit-il recevoir des informations sur l'image ? La partie téléchargement du code n'est pas un problème, le problème principal est de savoir comment le côté serveur peut recevoir les informations d'image du côté APP. Sous l'architecture B/S, vous pouvez définir enctype="multipart/form-data" directement via le formulaire, et les informations sur l'image seront dans le tableau $_FILES. Alors, est-ce également vrai en mode C/S ?

Réponse 1 (voir méthode 1)

 :

Généralement, la transmission de flux binaire est utilisée. Le client transmet des données binaires, le serveur les reçoit, puis file_put_contents est écrit. dans le fichier. Le format du nom de fichier et l'emplacement du fichier sont tous définis par vous-même.

Réponse 2 (voir méthode 2) : Le client Android ou IOS simule une requête HTTP Post au serveur, et le serveur reçoit la requête Post correspondante (via $_FILES Obtenir ressources d'image) et renvoyer les informations de réponse au client. (Cette méthode est la même que la méthode d'obtention de la soumission Html)

Méthode 1 :

Crypter l'image en base64 dans une chaîne et la transmettre

Instructions : Côté IOS ou Android : Encodez en Base64 l'image pour obtenir la chaîne, et transmettez-la à l'interface

Côté interface : Base64 décode la chaîne reçue, puis téléchargez-la à l'emplacement spécifié via la fonction file_put_contents

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


        } while(0);        return $res;
    }
Copier après la connexion

方式二: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, &#39;DEBUG&#39;);        $file_log = print_r($_FILES, true);        Log::record($file_log, &#39;DEBUG&#39;);        $token = $_POST[&#39;token&#39;];        $token_str          = jwt_decode($token);$user_type          = $token_str[&#39;user_type&#39;];

        // 设置附件上传子目录
        if($user_type == 1) {            $savePath = &#39;travel/group/&#39; . $user_companyid . &#39;/&#39;;
        }elseif ($user_type == 2) {            $savePath = &#39;bus/group/&#39; . $user_companyid . &#39;/&#39;;
        }elseif ($user_type == 3) {            $savePath = &#39;driver/group/&#39; . $user_companyid . &#39;/&#39;;
        }else {            $array[&#39;status&#39;] = 3;            $array[&#39;comment&#39;] = &#39;非法用户!&#39;;            return $array;
        }        $this->upconfig[&#39;savePath&#39;] = $savePath;        // 保存上传的文件(单张)
//        $res = $this->upload($_FILES[&#39;file&#39;]);

    
        // 保存上传的文件(多张) 移动端的表单name=“xxx[]”,支持多张图片
        $res = $this->upload();        $array[&#39;status&#39;] = $res[&#39;status&#39;];        $array[&#39;comment&#39;] = $res[&#39;comment&#39;];        $array[&#39;responseParameters&#39;][&#39;img_url&#39;] = $res[&#39;img_url&#39;];        echo json_encode($array);
    }    protected function upload() {        $res[&#39;status&#39;] = 1;        $res[&#39;imgurl&#39;] = &#39;&#39;;        $res[&#39;comment&#39;] = &#39;&#39;;        do {            $ret = true;            $fullPath = $this->upconfig[&#39;rootPath&#39;] . $this->upconfig[&#39;savePath&#39;];            if(!file_exists($fullPath)){                $ret = mkdir($fullPath, 0777, true);
            }            if(!$ret) {                // 上传错误提示错误信息
                $res[&#39;status&#39;] = 1;                $res[&#39;comment&#39;] = "创建保存图片的路径失败!";                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", &#39;DEBUG&#39;);            $info_log = print_r($infos,true);            Log::record($info_log, &#39;DEBUG&#39;);            if(!$infos) {                // 上传错误提示错误信息
                $res[&#39;status&#39;] = 2;                $res[&#39;comment&#39;] = $upload->getError();
            } else {                // 获取的上传成功的图片数量
                $info_count = 0;                // 上传成功 获取上传文件信息
                foreach($infos as $k => $v) {                    $imgurl[$v[&#39;key&#39;]][] =  str_replace(&#39;./&#39;, &#39;/&#39;, $this->upconfig[&#39;rootPath&#39;] . $v[&#39;savepath&#39;].$v[&#39;savename&#39;]);                    $info_count += 1;
                }                if($file_count != $info_count) {                    $res[&#39;status&#39;] = 1;                    $res[&#39;comment&#39;] = "上传失败!上传的多张图片,没有全部上传成功";
                }else {                    $res[&#39;status&#39;] = 0;                    $res[&#39;comment&#39;] = "上传成功!";                    $res[&#39;img_url&#39;] = $imgurl;
                }
            }

        } while(0);        return $res;
    }
Copier après la connexion

相关推荐:

相关推荐:

php 图片上传

图片和传真查看器 PHP 图片上传代码

PHP 图片上传代码_PHP教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!