PHP 图片上传

时间:2022-12-28 08:22:20

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