Android多图片上传到php服务器(包含php多图上传接口详细实现)

起因

因公司业务需要,需要将公司人员的档案信息进行合理化管理,涉及到将员工的简历图片以及身份证复印件的图片上传到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
里面有详细的使用

结果

每实现一个效果都会杀死一个程序员 老铁们 我太难了

发布了43 篇原创文章 · 获赞 60 · 访问量 6740

猜你喜欢

转载自blog.csdn.net/yuhang01/article/details/103681520