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; }