Java IOS客户端上传多张图片到服务端
业务场景: 用户相册需要上传多张图片到服务器,上限为12张。本文主要介绍Java服务端的文件和流的处理。 下图为iOS端和服务端最终结果一览。
iOS端 :
服务端:
如图在debug模式下,(MultipartHttpServletRequest) request 接收到的参数为multtipartFiles[]的一个数组。
每一项包括文件名、文件流、和文件大小。这项我们就通过遍历数组然后将文件写入到服务器的文件中,将新文件、文件URL、对应的用户ID 保存到数据库。
关于下面的code首先进行一下简要的说明:
BufferedInputStream 和 BufferedOutputStream 流的使用
CommonsMultipartFile类型的文件
对文件拓展名的判断
对文件在服务器存储URL和文件名的处理,我将上传的 原文件名+订单号生成工具+拓展名(.jpg|.png)
/**
* 上传相册
*
* @param photo
* @return
*/
@RequestMapping(value = Router.User.COMPLETE_ALBUM_INFORMATION, method = RequestMethod.POST)
@ResponseBody
public Response complete_album_information(@RequestParam("userId") int userId,MultipartHttpServletRequest request, HttpServletResponse response) {
log.info("用户完善基本资料开始");
Response res = this.getReponse();
CommonsMultipartFile multipartFile = null;
BufferedInputStream is = null;
BufferedOutputStream out = null; // 准备好一个输出的对象
try {
Iterator itr = request.getFileNames();
while(itr.hasNext()){
String str = itr.next();
multipartFile = (CommonsMultipartFile)request.getFile(str);
String[] fileExts = {"jpg", "png"};
String fileName = multipartFile.getOriginalFilename(); //原文件名
String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length());
if (Arrays.binarySearch(fileExts, fileExt) != -1) {
MultipartFile mpf = request.getFile(str);
InputStream inputStream = mpf.getInputStream();
is = new BufferedInputStream(inputStream);
String url = "D:\\programmeTools\\nginx-1.12.1\\photo" + "/" + str + OrderGeneratedUtils.getOrderNo() + "." + fileExt;
File newFile = new File(url);
if(is != null) {
out = new BufferedOutputStream(new FileOutputStream(newFile));
byte[] buffer = new byte[1024];
int len = -1;
while ((len = is.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
String name = str + OrderGeneratedUtils.getOrderNo() + "." + fileExt;
List albumList = userAlbumService.findByUserId(userId);
if(albumList.size() < 10) {
UserAlbum album = new UserAlbum(userId,name, url, new Date());
userAlbumService.save(album);
}else {
res.failure("图片数量超过上限");
}
}else {
return res.failure("该文件为空");
}
}else {
return res.failure("该文件类型不能够上传");
}
}
return res.success("上传成功");
} catch (Exception e) {
log.error("errorMsg:--- 用户相册上传失败" + e.getMessage());
return res.failure(e.getMessage());
}finally {
if(is != null) {
try {
is.close();
}catch (Exception e) {
e.printStackTrace();
}
}
if(out != null) {
try {
out.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
}