起因
因公司业务需要,需要将公司人员的档案信息进行合理化管理,涉及到将员工的简历图片以及身份证复印件的图片上传到php的服务器上(因不确定员工上传图片时遗漏,选择多图上传)
ps:数据库已经给我,我负责接口的实现以及Android端将图片上传到接口中 然后在接口中将数据添加到数据库中
数据库中字段要实现的效果:
就是在指定的字段中(如我的img字段中)上传多少张图片就用几个逗号进行分割
经过
单张图片上传以及php接口
废话不多比比 直接开始:(其中我的Android端的图片选择请参考)->点此进入仿微信图片选择器效果的详细教程
实现效果图的效果的图片选择请参考链接 下文不再详细介绍
效果图:
具体的代码实现:
android端:
private static final int REQUEST_SELECT_IMAGES_CODE = 0x01;
private ArrayList<String> mImagePathf;
//点击图片上传button点击事件的业务处理
binding.starffRecordZssc.setOnClickListener(new View.OnClickListener() {//证书上传
@Override
public void onClick(View v) {
ImagePicker.getInstance()
.setTitle("标题")//设置标题
.showCamera(true)//设置是否显示拍照按钮
.showImage(true)//设置是否展示图片
.showVideo(true)//设置是否展示视频
.setMaxCount(1)//设置最大选择图片数目(默认为1,单选)
.setSingleType(true)//设置图片视频不能同时选择
.setImagePaths(mImagePathf)//设置历史选择记录
.setImageLoader(new GlideLoader())//设置自定义图片加载器
.start(StarffRecordAdd.this, REQUEST_SELECT_IMAGES_CODE);//REQEST_SELECT_IMAGES_CODE为Intent调用的requestCode
}
});
//选择图片后的回调
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_SELECT_IMAGES_CODE && resultCode == RESULT_OK) {
mImagePathf =data.getStringArrayListExtra(ImagePicker.EXTRA_SELECT_IMAGES);
Bitmap bm = BitmapFactory.decodeFile(mImagePathf.get(0));//设置加载第一个图片
String img = ChangeBase.bitmapToBase64(bm);//将图片转换为Base64的格式 准备往接口中发送
}
}
将图片转换为Base64的类:
public class ChangeBase {
public static String bitmapToBase64(Bitmap bitmap) {
// 要返回的字符串
String reslut = null;
ByteArrayOutputStream baos = null;
try {
if (bitmap != null) {
baos = new ByteArrayOutputStream();
/**
* 压缩只对保存有效果bitmap还是原来的大小
*/
bitmap.compress(Bitmap.CompressFormat.JPEG, 30, baos);
try {
baos.flush();
} catch (IOException e) {
e.printStackTrace();
}
baos.close();
// 转换为字节数组
byte[] byteArray = baos.toByteArray();
// 转换为字符串
reslut = Base64.encodeToString(byteArray, Base64.DEFAULT);
Log.i("sss",reslut);
} else {
return null;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (baos != null) {
baos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return reslut;
}
}
ok ,这样android客户端就算是搞定了
然后我们来一起看看php接口端的单图上传的实现
public function test(){
$model = D('Atest');
$data = array();
$jsonarr = array();
$data['img'] = I('post.img');
$name=time();
if(!empty($data['img'])){
//目录
$rootPath = './Public/data/hr/xuelizhengshu/';
$path = 'data/hr/xuelizhengshu/';//文件上传子目录
$data['img']=base64_decode($data['img']);
file_put_contents($rootPath.$name.'.jpg',$data['img']);
$data['img']=$path.$name.'.jpg';
}
$datalist=$model->add($data);
if($datalist){
$jsonarr['state'] = "access";
$jsonarr['date'] = $datalist;
}
header('Content-Type:text/html; charset=utf-8');
exit(json_encode($jsonarr,JSON_UNESCAPED_UNICODE));
}
ok 然后只需要在android客户端将img发送到接口中 然后接口就会将数据写入到我们的数据库 like this
多图片上传以及php接口
多图片上传和单图片上传的思路差不多
android客户端实现:
private static final int REQUEST_SELECT_IMAGES_SECOND = 0x02;
private ArrayList<String> mImagePaths;
private Map<String,String> jianli;
private int shenfencount = 0;
//多图片上传button的点击事件处理
binding.starffRecordSfzfyj.setOnClickListener(new View.OnClickListener() {//身份证复印件
@Override
public void onClick(View v) {
ImagePicker.getInstance()
.setTitle("标题")//设置标题
.showCamera(true)//设置是否显示拍照按钮
.showImage(true)//设置是否展示图片
.showVideo(true)//设置是否展示视频
.setMaxCount(5)//设置最大选择图片数目(默认为1,单选)
.setSingleType(true)//设置图片视频不能同时选择
.setImagePaths(mImagePaths)//设置历史选择记录
.setImageLoader(new GlideLoader())//设置自定义图片加载器
.start(StarffRecordAdd.this, REQUEST_SELECT_IMAGES_SECOND);//REQEST_SELECT_IMAGES_CODE为Intent调用的requestCode
}
});
//回调处理
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_SELECT_IMAGES_SECOND && resultCode == RESULT_OK) {
mImagePaths = data.getStringArrayListExtra(ImagePicker.EXTRA_SELECT_IMAGES);
jianli = new HashMap<>();
jianli.clear();
for(int i=0;i<mImagePaths.size();i++){
jianli.put("jianliimg"+i,ChangeBase.bitmapToBase64(BitmapFactory.decodeFile(mImagePaths.get(i))));
}
shenfencount= mImagePaths.size();
}
}
多图片上传的难点就是无法确定要上传图片的个数,以及发送过去的参数的个数
其中我的网络请求使用的Retrofit 然后我使用自带的可变参数@FieldMap
网络请求的参数
//这里我使用的是kotlin的写的
@FormUrlEncoded
@POST("Hrmdanganjson/add")//人员档案添加数据
fun getrecordaddadd(@Field("shenfencount") shenfencount:Int, @FieldMap jianli:Map<String,String>)
ok,这样我们只需要将我们的图片的个数和转为Base64的所有图片拿到 发送给接口 到此 我们的安卓端的操作算是结束了
php多图片上传的接口实现:
public function test(){
$model = D('Atest');
$data = array();
$jsonarr = array();
$shefenzhengcount = I('post.shenfencount');
$name=time();
for ($x=0; $x<$shefenzhengcount; $x++) {//拿到身份证上传图片的个数 ->3
$current = I('post.jianliimg'.$x);
$name+=2;
$rootPath = './Public/data/hr/jianlishangchuan/';
$path = 'data/hr/jianlishangchuan/';
$current=base64_decode($current);
file_put_contents($rootPath.$name.'.jpg',$current);
$shuzu[]=$path.$name.'.jpg';
}
$data['jianliimg']=implode(',',$shuzu);
$datalist=$model->add($data);
if($datalist){
$jsonarr['state'] = "access";
$jsonarr['date'] = $datalist;
}
header('Content-Type:text/html; charset=utf-8');
exit(json_encode($jsonarr,JSON_UNESCAPED_UNICODE));
}
我们在php中根据图片的个数进行for循环 临时的图片存储字段对应的就是android端HashMap的key 的字段
然后在for循环内将每次遍历好的数据放到一个数组中 然后再for循环外将我们数据库存放多图的那个字段接收这个数组 别忘了用逗号进行分割哟
ok 这就结束了 仿微信的图片选择器效果的实现请记得参考我的https://blog.csdn.net/yuhang01/article/details/102398127
里面有详细的使用
结果
每实现一个效果都会杀死一个程序员 老铁们 我太难了