背景:文件流的应用很广泛,各种图片,视频,文件的上传、下载都需要使用到文件流。最近项目中有使用到文件操作,所以总结出来,下面是具体流程
multipartfile
我们项目中使用到的框架是springboot, 采用前后端分离技术,前端在进行文件传递是,后端接受到的文件参数是multipartfile, 我们需要将文件上传到微信,这期间遇到问题,如果直接将multipartfile作为参数上传,是有异常的。必须转换格式上传,那么应该转换成什么格式呢,该怎么转换呢。
file
答案是file,对,没错,就是file,那么问题了,我们该如何将multipartfile转换file呢,话不多说,先上代码,后面一一讲解
示例代码
/**
* 图片上传
* @param file
* @return
*/
@RequestMapping("/uploadPic")
@ResponseBody
@NoSign
public Result uploadPic(MultipartFile file){
String pathName = "/mnt/tempfile/";
String originalName = file.getOriginalFilename();
//1
File path = new File(pathName);
//2
if(!path.exists()){
path.mkdirs();
}
//3
File f = new File(path, originalName);
try {
//4
file.transferTo(f);
//5
File uploadFile = new File(pathName+ originalName);
//6
//业务逻辑操作 需要使用到文件流
//7
uploadFile.delete();
} catch (IOException e) {
e.printStackTrace();
}
return Result.success();
}
首先创建一个目录/mnt/tempfile/,见1、2注释,如果目录不存在则创建,注释3处,根据文件名和刚刚创建的目录创建一个空文件,接下来,看注释4,核心方法,将multipartfile文件,以刚刚创建的目录文件写入到文件中。至此,聪明的你,应该可以看出来,这个方法的妙处,我们先将Multipartfile格式的数据写入到本地,然后通过队友的目录创建一个file,就可以轻松的将multipartfile转为file格式,如注释5处所示,我们获取到一个file格式的数据流,下面注释6处我们就可以通过这个file数据流处理我们的数据了
如果你以为就这样就结束了,那就很遗憾了,我们还有关键的一部,那就是对于刚刚在本地创建的文件的删除处理,试想下,那个文件只是一个临时中转文件,如果不删除,时间久了,上传文件多了,对磁盘也是一个消耗,哈哈~~,毕竟服务器的资源还是很宝贵的。眼睛精的你,一定会发现注释7中的文件删除方法,但是在你操作完之后,你会很奇怪的发现文件还是存在的,并没有被删除掉,这个什么原因呢,一脸蒙蔽,哪里出错了嘛?
好了,该揭晓答案了,原因是我们在对上面的文件流进行业务操作的时候,对文件流一直占用着,一直没有是否,所以,这边删除一直不能成功,而且也没有任何报错,是个很重要的细节点,代码如下所示:
public static String md5HashCode(InputStream fis) {
try {
MessageDigest MD5 = MessageDigest.getInstance("MD5");
byte[] buffer = new byte[8192];
int length;
while ((length = fis.read(buffer)) != -1) {
MD5.update(buffer, 0, length);
}
return new String(Hex.encodeHex(MD5.digest()));
} catch (Exception e) {
e.printStackTrace();
return null;
}finally {
if(fis != null){
try {
//1
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
如注释1处所示,这边对文件流进行了操作,所以一定要进行关闭。
好了,今天的分享就到这边了,虽然不是很深入,但很实用,希望其他朋友不会再遇到这种坑了,若有哪边不正确,欢迎指正。