用spring-mvc接受移动端图片上传

一开始想到使用soa的形式,使用rest对外发布接口地址,想想挺好的,但因为不熟,时间比较紧,出什么篓子压力就打了,

还是先使用spring-mvc吧,做好工作的第一件工作,哈哈

具体开发的时候还是挺烦的,曲折。

首先规定了移动端掉服务端数据的格式是这样子的 http://ip:port/V20?{json}

好吧,和我一开始想的根据url直接映射到方法执行泡汤了。

然后先写个路由controller,用@RequestMapping(value="V20")去接受所有的请求,从json中获取到方法名再转发到具体方法, “forward:/method?json=json”   嗯,这样子也不错。

但是移动端传给我的是base64的数组字符串,但我把这串字符串转发给具体执行方法的时候,oh,no不行了,参数中一些特殊字符经过转发后变了,如果“+”号,那我直接替换那些不能识别的字符成代码 如“+”换成 %25B。按理说肯定应该可以了,但是传过去后还是不对,也不知道为什么,没深究。还想,先把图片的base64字符串转成byte[]传过去,我只能说我太天真了,byte[]数组一经转发就不一样了,更何况多张图片多个byte[],那不成byte[][]。

最后弄得有点烦,好像用spring-mvc原先的转发映射搞不定(肯定是我自己哪个地方没处理好)

那最后的解决方法是自己写一个路由,根据methodname找到某个action中的方法。

在RouteController中写了

private static Map<String, Object> objectMap = new HashMap<String, Object>();

 private static Map<String, Method> methodMap = new HashMap<String, Method>();

 

 static{

  //找到action下的所有类

  List<Class> list= ClassSearcher.findClasses();

  if(list!=null&&list.isEmpty()==false){

   for(Class clz:list){

    Method[] ms = clz.getDeclaredMethods();

    for(Method m : ms){

     Object o = null;

     try {

      //从spring中获取对象

      o = SpringContextHolder.getBean(clz);

     } catch (Exception e) {

      log.error("srping容器中没有:"+clz+"对象",e);

     }

     objectMap.put(m.getName(), o);

     methodMap.put(m.getName(), m);

    }

   }

  }

  log.info("初始化执行方法对象map================"+objectMap);

  log.info("初始化执行方法map================"+methodMap);

 }

然后根据json中的方法名

Object o = objectMap.get(accept.getMethod());

   Method m = methodMap.get(accept.getMethod());

   if(o!=null && m!=null){

    Object result = m.invoke(o, new String[]{uid,source,accept.getArguments()});

    return result.toString();

   }else{

    log.info("未找到请求的对应方法=========方法名:"+accept.getMethod());

    reverse.setStatus(2);

    reverse.setMsg("未找到请求方法的对应方法");

    return JSON.toJSONString(reverse);

   }

感觉好简陋,但一时间想不出好的方法,也希望大神们能指点一下。根据methodName找到controller的方法,不使用@RequestMapping(value = "/V20")    转发映射关系



你可能感兴趣的:(移动端上传图片)