项目场景:
提示:这里简述项目相关背景:
FastDFSClient上传文件提示空指针异常,MultipartFile获取不到文件
问题描述
在文件上传时一直提示空指针异常,一开始以为时虚拟机的连接错误,先后修改连接地址,修改配置文件等做了很多无用功。最后发现方法中参数获取文件时获取不到,参数file直接就是null.
最初代码如下:
@Value("${FILE_SERVER_URL}")
private String FILE_SERVER_URL;//文件服务器地址
//上传功能
@PostMapping("upload")
public Result upload(MultipartFile file){
try{
FastDFSClient client = new FastDFSClient("fdfs_client.conf");
String str = client.uploadFile(file.getBytes(),"jpeg");
String result = FILE_SERVER_URL + str;
return new Result(true,StatusCode.OK,"上传成功",result);
}catch (Exception e){
e.printStackTrace();
return new Result(false,StatusCode.ERROR,"上传失败",null);
}
}
原因分析:
提示:这里填写问题的分析:
自己找了好长时间没有解决错误,最后看到一篇分析,突然就理解了
spring-boot自带的org.springframework.web.multipart.MultipartFile
和Multipart产生冲突,如果同时使用了MultipartResolver 和ServletFileUpload,就会在iter.hasNext()返回false.然后整个循环就跳出去了。整个问题产生的原因是Spring框架先调用了MultipartResolver 来处理http multi-part的请求。这里http multipart的请求已经消耗掉。后面又交给ServletFileUpload ,那么ServletFileUpload 就获取不到相应的multi-part请求。因此将multipartResolve配置去除,问题就解决了。单文件的话只需要一个变量,多文件上传的话就将MultipartFile改为数组,然后分别上传保存即可。
解决方案:
提示:这里填写该问题的具体解决方案:将方法中参数改为数组,在读取文件时先将数组toString()转成字符在获取字节即可getBytes()。试了一下果然解决了错误。
修改后代码如下:
@Value("${FILE_SERVER_URL}")
private String FILE_SERVER_URL;//文件服务器地址
@PostMapping("upload")
public Result upload(MultipartFile[] file) {
try {
//2、创建一个 FastDFS 的客户端
FastDFSClient fastDFSClient = new FastDFSClient("fdfs_client.conf");
//3、执行上传处理
String path = fastDFSClient.uploadFile(file.toString().getBytes(),"jpeg");
//4、拼接返回的 url 和 ip 地址,拼装成完整的 url
String url = FILE_SERVER_URL + path;
return new Result(true, StatusCode.OK, "上传成功",url);
} catch (Exception e) {
e.printStackTrace();
return new Result(false, StatusCode.ERROR, "上传失败");
}
}
}
}