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端应该如何接收图片信息?
解答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; }