曾经遇到使用阿里的dubbo微服务框架,在做文件上传时远程注入服务,结果发现Controller这层是有文件信息的,但是到了service层文件报空,文件丢失。(如果是直接在Controller层完成文件处理存储就好远程调用没关系了)
开始认为是序列化和反序列话的问题,结果查看源码发现MultipartFile的子类CommonsMultipartFile已经实现序列化
查了资料,原来dubbo框架是不支持远程文件和流的传送。所以当文件从Controller层传送到service层的时候,文件丢失了。
解决办法:
1.网上下载别人封装好的jar包
2.最简单的把文件或者流转化为byte数组进行传送(后来发现有挺多免费的第三方图片文件保存实现也是用这种)
以下是Controller上传文件的方法,
commonCenterServiceImpl是远程注入的文件上传服务
@Reference
private CommonCenterService commonCenterServiceImpl;
@RequestMapping(value = "/image", method = RequestMethod.POST)
@ResponseBodypublic AjaxResult uploadImagePost(@RequestParam("imgs") MultipartFile imgs,HttpServletRequest request,Model model) throws FileNotFoundException, IOException {
List
//获取項目的路径
String path = request.getServletContext().getRealPath("/uploads");
//获取文件类型
String contentType = img.getContentType();
//判断文件是不是图片
if(allowType.contains(contentType)){
//获取上传文件的原始文件名
String oFileName=img.getOriginalFilename();
//把文件转化成byte[]
byte[] bytes = img.getBytes();
String imageUrl = commonCenterServiceImpl.uploadImagePost(bytes, path,oFileName);
return AjaxResult.me().setMessage("上传成功").setData(imageUrl );
}
}
一下是远程service服务处理保存文件的方法
@Override
public String uploadImagePost(byte[] imgs, String path,String oFileName) {
FileOutputStream fos = null;
BufferedOutputStream bos = null;
try {
//获取文件名的后缀
String fNameSuffix= FilenameUtils.getExtension(oFileName);
//生产一个随机的文件名
String uuidName = UUID.randomUUID().toString();
String fileName=uuidName+"."+fNameSuffix;
//使用file流写文件
File file=new File(path,fileName);
//判断父目录是否存在,不存在就创建
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
bos.write(imgs);
String filePath = path+File.separator+fileName;
return filePath;
} catch (Exception e) {
e.printStackTrace();
return null;
}finally {
try {
if (bos != null) {
bos.close();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fos != null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}