您的位置:首页 > 其它

关于dubbo微服务框架,传送文件报空的问题

2018-01-08 10:20 253 查看

关于dubbo微服务框架,传送文件报空的问题

曾经遇到使用阿里的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)

@ResponseBody
public AjaxResult uploadImagePost(@RequestParam("imgs") MultipartFile imgs,HttpServletRequest request,Model model) throws FileNotFoundException, IOException {

List<String>allowType=Arrays.asList("image/bmp","image/png","image/gif","image/jpg","image/jpeg","image/pjpeg"); 

//获取項目的路径
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();
}
     }
   }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: