近期做了一个微信图片上传的功能,微信端是以base编码post提交到后台的,功能完成后,测试andriod机上传的图片下载下来是正常的,但是ios机上传的图片下载下来的图片是损坏的。我们先来看代码。
public void fileUpload(final HttpServletRequest request, final HttpServletResponse response) {
String imgStr = request.getParameter("file");
String fileName = request.getParameter("fileName");
String fileType = request.getParameter("fileType");
logger.info(">>>>>>>FileUploadController:imgStr:" + imgStr);
logger.info(">>>>>>>FileUploadController:fileName:" + fileName + "fileType:" + fileType);
Map<String, Object> resMap = new HashMap<String, Object>();
if (StringUtils.isEmpty(imgStr)) {
resMap.put("respCode", "0001");
resMap.put("respMsg", "图片信息为空!");
super.toJson(resMap, response);
return;
}
String fssId = null;// 上传返回信息
try {
imgStr = imgStr.replace("data:image/jgp;base64,", "");
byte[] decodeBuffer = Base64.decodeBase64(imgStr.getBytes());
// 定义根路径
String rootPath = request.getRealPath("/");
String sourcePath = rootPath + "temp_upload/";
File selfCheckingFolder = new File(sourcePath);// 创建文件夹
if (!selfCheckingFolder.exists()) {
selfCheckingFolder.mkdirs();
}
File sourceFile = new File(sourcePath + fileName + ".jpg");
FileOutputStream outputStream = null;
try {
outputStream = FileUtils.openOutputStream(sourceFile);
outputStream.write(decodeBuffer);
outputStream.flush();
fssId = FssFileClient.upload(APP_CODE, sourceFile);// 图片上传云存储
logger.info(">>>>>>>FileUploadController:fssId:" + fssId);
} catch (Exception e) {
logger.error(">>>>>>>FileUploadController exception", e);
resMap.put("respCode", "0003");
resMap.put("respMsg", "字节转图片失败!");
super.toJson(resMap, response);
return;
} finally {
IoUtil.close(outputStream);
if (sourceFile != null && sourceFile.exists()) {
sourceFile.delete();
}
}
} catch (Exception e) {
logger.error(">>>>>>>FileUploadController>>>图片上传失败", e);
resMap.put("respCode", "0002");
resMap.put("respMsg", "图片上传失败!");
super.toJson(resMap, response);
return;
}
// 将上传的资质信息保存入库
CheckingFile checkingFile = new CheckingFile();
checkingFile.setFileName(fileName);
checkingFile.setFssid(fssId);
checkingFile.setFileType(fileType);
checkingFile.setCreateTime(new Date());
checkingFileService.createCheckingFile(checkingFile);
resMap.put("respCode", "0000");
resMap.put("respMsg", "图片上传成功!");
resMap.put("fssId", fssId);
logger.info(">>>>>>>FileUploadController:resMap:" + resMap);
super.toJson(resMap, response);
return;
}
再来看下前台传过来的base64编码:
(1)andriod手机传到后台的:
(2)ios端传到后台的:
比较传输到后台的base64编码数据,发现ios比andriod多传输了 data:image/jgp;base64,
所以造成了无法解码,我们通过后台将data:image/jgp;base64, 替换掉就可以解决问题了