经验分享:Android端通过HttpURLConnection上传文件到服务器Android工程师

/ 集美大学音乐学院Android工程师 / 2017-05-10

Android开发,Android初学者,服务器,上传图片

一:实现原理


最近在做Android客户端的应用开发,涉及到要把图片上传到后台服务器中,自己选择了做Spring3 MVC HTTP API作为后台上传接口,android客户端我选择用HttpURLConnection来通过form提交文件数据实现上传功能,本来想网上搜搜拷贝一下改改代码就好啦,发现根本没有现成的例子,多数的例子都是基于HttpClient的或者是基于Base64编码以后作为字符串来传输图像数据,于是我不得不自己动手,参考了网上一些资料,最终实现基于HttpURLConnection上传文件的android客户端代码,废话少说,其实基于HttpURLConnection实现文件上传最关键的在于要熟悉Http协议相关知识,知道MIME文件块在Http协议中的格式表示,基本的传输数据格式如下:


Android开发,Android初学者,服务器,上传图片


其中boundary表示form的边界,只要按照格式把内容字节数写到HttpURLConnection的对象输出流中,服务器端的Spring Controller 就会自动响应接受,跟从浏览器页面上上传文件是一样的。


服务器端HTTP API, 我是基于Spring3 MVC实现的Controller,代码如下:

@RequestMapping(value = "/uploadMyImage/{token}", method = RequestMethod.POST)
public @ResponseBody String getUploadFile(HttpServletRequest request, HttpServletResponse response,
@PathVariable String token) {
     logger.info("spring3 MVC upload file with Multipart form");
     logger.info("servlet context path : " + request.getSession().getServletContext().getRealPath("/"));
     UserDto profileDto = userService.getUserByToken(token);
     String imgUUID = "";
     try {
          if (request instanceof MultipartHttpServletRequest && profileDto.getToken() != null) {
                MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
                logger.info("spring3 MVC upload file with Multipart form");
                // does not work, oh my god!!
                MultipartFile file = multipartRequest.getFiles("myfile").get(0);
                InputStream input = file.getInputStream();
                long fileSize = file.getSize();
                BufferedImage image = ImageIO.read(input);
                // create data transfer object
                ImageDto dto = new ImageDto();
                dto.setCreateDate(new Date());
                dto.setFileName(file.getOriginalFilename());
                dto.setImage(image);
                dto.setCreator(profileDto.getUserName());
                dto.setFileSize(fileSize);
                dto.setType(ImageAttachmentType.CLIENT_TYPE.getTitle());
                dto.setUuid(UUID.randomUUID().toString());
 
                /// save to DB
                imgUUID = imageService.createImage(dto);
                input.close();
          }
     } catch (Exception e) {
          e.printStackTrace();
          logger.error("upload image error", e);
     }
 
     return imgUUID;
}

Android客户端基于HttpURLConnection实现上传的代码,我把它封装成一个单独的类文件,这样大家可以直接使用,只要传入上传的URL等参数即可。

汇鱼人才为您提供最新Android经验,咨询。


公众号,微信

汇鱼网海峡创乐汇
汇鱼网海峡创乐汇