最近的case中需要用到用户发布上传图像的问题,每次发布的图片数量控制在三张,可以相机拍照,可以相册选择
图片的存储,我们在数据库中存储的是在服务器中的地址,一个字段存储多张图片,每个图片的地址用 , 号隔开,
因为我们知道 ,号是觉得不可能出现在图片名称的命名之中的,然后每次返回json的时候图片地址都会根据 , 好进行切分,
得到数组变成json子串返回,
我们采用的就是两步上传,第一次程序上传的是用户发布的时间,内容,等非图片的东西,返回状态码和在数据库中保存的记录数(行数)
行数是用来记录接下来需要上传的图片是存储在第几行的元数据里面的 图片字段中
其中第一步上传的时候,存储图片的 字段为空;第二步上传的时候根据返回的状态码 把图片的base64为码一个一个的传回去,每次传回带上参数:
第一个必要的参数 第一步传回的行数 ,第二个必要的参数是图片的base64位码,当然我还传回了总共有多少张图片的number,还传回了当前是第几张图片的index
后面的参数可以让你在后台php代码中知道什么时候结束,改变返回状态码的值,
这里现在这样假设下:如果是上传三张图片,第一次上传第一张图片的时候,上传成功,也保存到服务器文件夹里,也保存到了数据库 图片字段中,但是由于1<3,
后台就知道图片还没有上传完,所以反正状态码1,告诉Android客户端,你还没有上传完,Android客户端得到这个返回码,handler传递处理判断之后,知道我已经上传成功
并且我还需要继续上传,不过这个时候我们需要多加一个判断,就是前面传回给服务器当前上传的第几张图片数量+1是否超过存储图片base64位的数组的长度,没有超过,
继续递归上传,参数是需要改变的哦,直到服务器返回的是非1的数值或者index大于或者等于数组的长度,那么上传完了,就弹出提示框发布成功
整个思路就是这样的,下面来看php代码,post方法
$publish_id=$_POST['publish_id'];/*某条记录的ID*/
$userid=$_POST['uid'];//用户的id,这个参数是用来判断是哪个用户发的,
$picnum = $_POST['picnum'];/*总图片数4*/
$num = $_POST['num'];/*当前的第几张图片了*/
$file_name = base64_decode( $_POST['base64']);//php函数库里面有这个方法,就是把string转成bitmap
//这里啰嗦一点,我上传图片,还没有对文件进行加密处理,最简单的一种方式是在生成的base64位码中我们插入一段特殊的字符串,
//然后后台接收到这个字符串的时候用str_replace()替换掉就好了,还有很多其他的方式,不说了,
//接下来是需要构建你存储在服务器上的地址的
$savePath = 'data/upload/images/'; //这个图片的文件夹的路径你可以定死,放在data下面就行了
$savePath = str_replace('\\', '/', $savePath);/*把$path中的\\换成/*/
if(!file_exists($savePath)){
mkdir($savePath);//文件路径不存在的时候你需要重新创建,如果赋予权限的话,你需要加上第二个参数 0777
}
//接下来要准备的是图片的名字,由于图片的名字如果是一样的,很容易是覆盖掉前面的在文件夹里面的图片,特别是我们如果只用时间戳的话,
$url=$userid.time().$num.$userid.'.jpg'; /*图片名,我们加上当前是第几张图片,这个变动的数字可以保证命名不重复的*/
//接下来就是构建图片的路径了,文件夹路径+图片名就是 图片的路径了
$file=$savePath.$url;
$m=fopen($file,"w");/*当参数为"w"时是将内容覆盖写入文件,而当参数为"a"时是将内容追加写入。以可写的方式打开文件*/
//接下来就是需要把图片保存到文件夹里面,用到的是fwrite函数
if(fwrite($m,$file_name)){ /*说明保存成功,执行了将64位编码的文件写入到$m指针中*/
fclose($m);//必须关闭
//如果保存文件夹里成功了,还是别忘记了还需要存储到数据库的相应的字段中啊,在数据库图片字段中存储的是图片名,多张图片用 ,号隔开
/*将图片名插入到数据库中*/
if($num==0&&$picnum==1)
$data['imglist'] = $url;
else if($num==0&&$num<$picnum-1)
$data['imglist'] = $url.',';
/*$m_jxdetail->field('imglist')->where("UUID=%d",$publish_id)->find();*/
else if($num>0&&$num<$picnum-1){
$imglist = $m_jxdetail->field('imglist')->where("UUID=%d",$publish_id)->find();
$data['imglist']=$imglist['imglist'].$url.',';
}
else
{
$imglist = $m_jxdetail->field('imglist')->where("UUID=%d",$publish_id)->find();
$data['imglist']=$imglist['imglist'].$url;
}
if($m_jxdetail->where("UUID=%d",$publish_id)->save($data)){
$json['status']=1;
}
else
$json['status']=-2;
上面处理的一个难点就是:保存在图片字段的内容在你追加的时候你需要先把它取出来,等会儿追加万再一起放进去,否则的话总是会被覆盖,也就是图片字段永远只保存了一个
上面的代码思路很清晰:就是在第一张图片保存的时候加上逗号,最后一张图片保存的时候不加上逗号,其他的都需要先把数据库图片字段内容取出来再追加当前的图片地址还要加上逗号,
所以上面的判断语句就是这个意思:
1.如果当前上传的图片是第一张,并且用户只会上传一张图片的时候
2.如果当前上传的图片是第一张,并且用户不只上传一张图片的时候,我们是需要在第一张图片的时候给他加上逗号的
3.如果当前用户上传的不是第一张图片,并且 也不是最后一张图片的时候
4.如果是最后一张图片,并且上传图片的数量超过1张的时候
这样的逻辑就构成了
if
else if
else if
else
很清晰的思路把,一看就懂,
最后是插入到数据中的判断,不解释了,
这个上传图片保存的就做了,OK 有问题请评论留下