最近我们项目需要一台图片服务器存储用户上传的图片,我们使用base64处理和存储图片,下面简单介绍一下如何使用 PHP 上传图片到 服务器,并获取相应图片的返回信息 可以参考一下
一:图片上传判断
/**
* base64图片上传
* @param $base64_img
* @return array
*
private static function img_upload($base64_img){
$base64_img = trim($base64_img);
$up_dir = '../../../upload/images/interface/';
if(!file_exists($up_dir)){
mkdir($up_dir,0777);
}
if(preg_match('/^(data:s*image/(w+);base64,)/', $base64_img, $result)){
$type = $result[2];
if(in_array($type,array('pjpeg','jpeg','jpg','gif','bmp','png'))){
$new_file = $up_dir.date('YmdHis_').method::getRandChar().'.'.$type;
if(file_put_contents($new_file, base64_decode(str_replace($result[1], '', $base64_img)))){
$img_path = str_replace('../../..', '', $new_file);
return array('code' => 1, 'msg' => "图片上传成功", 'url' => $img_path);
}
return array('code' => 2, 'msg' => "图片上传失败");
}
//文件类型错误
return array('code' => 4, 'msg' => "文件类型错误");
}
//文件错误
return array('code' => 3, 'msg' => "文件错误");
}
二:图片上传到服务器
// 关键在这里!
$post_data = file_get_contents($realpath); // raw_post方式
// 如果是是一个数组,则content_type自动为multipart/form-data
// $post_data = array(
// 'file' => "@$realpath"
// );
$headers = array();
$headers[] = 'Content-Type:'.$ext; // 还有这里!
curl_setopt($ch, CURLOPT_URL, $zimg_upload_url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//启用时会发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$info = curl_exec($ch);
curl_close($ch);
$json = json_decode($info, true);
$signature = $json['info']['md5'];
$imgurl = $zimg_domain . $signature;
return array('imgurl'=>$imgurl,'imgcode'=>$signature);
$post_data = file_get_contents($realpath); // raw_post方式
// 如果是是一个数组,则content_type自动为multipart/form-data
// $post_data = array(
// 'file' => "@$realpath"
// );
$headers = array();
$headers[] = 'Content-Type:'.$ext; // 还有这里!
curl_setopt($ch, CURLOPT_URL, $zimg_upload_url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//启用时会发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$info = curl_exec($ch);
curl_close($ch);
$json = json_decode($info, true);
$signature = $json['info']['md5'];
$imgurl = $zimg_domain . $signature;
return array('imgurl'=>$imgurl,'imgcode'=>$signature);
三:判断
<code>
<code>$upFile/<code> <code>= /<code><code>$_FILES/<code><code>[/<code><code>'file'/<code><code>];/<code>
<code>/**/<code>
<code>* 创建文件夹函数,用于创建保存文件的文件夹/<code>
<code>* @param str $dirPath 文件夹名称/<code>
<code>* @return str $dirPath 文件夹名称/<code>
<code>*//<code>
<code>function/<code> <code>creaDir(/<code><code>$dirPath/<code><code>){/<code>
<code> /<code><code>$curPath/<code> <code>= dirname(/<code><code>__FILE__/<code><code>);/<code>
<code> /<code><code>$path/<code> <code>= /<code><code>$curPath/<code><code>./<code><code>'\\'/<code><code>./<code><code>$dirPath/<code><code>;/<code>
<code> /<code><code>if/<code> <code>(/<code><code>is_dir/<code><code>(/<code><code>$path/<code><code>) || /<code><code>mkdir/<code><code>(/<code><code>$path/<code><code>,0777,true)) {/<code>
<code> /<code><code>return/<code> <code>$dirPath/<code><code>;/<code>
<code> /<code><code>}/<code>
<code>}/<code>
<code>//判断文件是否为空或者出错/<code>
<code>if/<code> <code>(/<code><code>$upFile/<code><code>[/<code><code>'error'/<code><code>]==0 && !/<code><code>empty/<code><code>(/<code><code>$upFile/<code><code>)) {/<code>
<code> /<code><code>$dirpath/<code> <code>= creaDir(/<code><code>'upload'/<code><code>);/<code>
<code> /<code><code>$filename/<code> <code>= /<code><code>$_FILES/<code><code>[/<code><code>'file'/<code><code>][/<code><code>'name'/<code><code>];/<code>
<code> /<code><code>$queryPath/<code> <code>= /<code><code>'./'/<code><code>./<code><code>$dirpath/<code><code>./<code><code>'/'/<code><code>./<code><code>$filename/<code><code>;/<code>
<code> /<code><code>//move_uploaded_file将浏览器缓存file转移到服务器文件夹/<code>
<code> /<code><code>if/<code><code>(move_uploaded_file(/<code><code>$_FILES/<code><code>[/<code><code>'file'/<code><code>][/<code><code>'tmp_name'/<code><code>],/<code><code>$queryPath/<code><code>)){/<code>
<code> /<code><code>echo/<code> <code>$queryPath/<code><code>;/<code>
<code> /<code><code>}/<code>
<code>}/<code>
<code> /<code><code>?>/<code>
<fieldset>
点击上传图片并发送后, 可以看到页面上显示出图片, 查看本地文件夹可以看到文件也已储存到服务器.
在客户端实现异步上传的关键在于FormData,关于这部分这里有详细介绍: FormData()
閱讀更多 toujun007 的文章