PHP關於AIP圖片上傳介面

來源:互聯網
上載者:User
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上傳類上傳的簡單案例:

          = 'maxSize'    =>    3145728,                 'exts'       =>    ('jpg', 'gif', 'png', 'jpeg'),        'rootPath'   =>    './Public/Uploads/info/',        'savePath'   =>    '',                                  'saveName'   =>    ('uniqid',''),        'autoSub'    =>    ,                               'subName'    =>    ('date','Ymd'),  upload(['result'] = 1['imgurl'] = ''['msg'] = '' =  = ->upconfig['rootPath'] . ->upconfig['savePath'(!( = (, 0777, (!                ['result'] = 0['msg'] = "建立儲存圖片的路徑失敗!"             =  \Think\Upload(->
(!                ['result'] = 0['msg'] = ->                 =  ->upconfig['rootPath'] . ['savepath'].['savename' = ('./', '/', ['result'] = 1['imgurl'] = (0          = ->upload(['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;    }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.