关于File与MultipartFile的用法概述
作者:叶枫^_^
这篇文章主要介绍了关于File与MultipartFile的用法概述,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
1.MultipartFile 概述
MultipartFile是SpringMVC提供简化文件流操作的接口,该接口实现类有如下几个
在不使用框架之前,都是使用原生的HttpServletRequest来接收上传的数据的,如下所示:
public String fileSave(HttpServletRequest request, HttpServletResponse response){ MultipartHttpServletRequest msr = (MultipartHttpServletRequest) request; MultipartFile targetFile = msr.getFile("file"); }
此处附上处理文件的一般操作
// MultipartFile targetFile // 文件写入路径 每次写文件的时候要保证 路径唯一 不会发生写入文件覆盖的问题 String fileName = targetFile.getOriginalFilename(); LOGGER.info("fileOnlineShowServiceImpl ==> fileSave() fileName : {}", fileName); // 临时将文件存放本地存储位置 String tempFilePath = downloadPath + File.separator + ToolsUtil.createUUID() + "_" + fileName; // 将文件写入到本地 localPath targetFile.transferTo(new File(tempFilePath)); LOGGER.info("fileOnlineShowServiceImpl ==> fileSave() tempFilePath : {}", tempFilePath); // 将内存的文件上传阿里云OSS,并转换成图片,返回对应的信息 Map<String, String> fileInfoMaps = fileDealWithService.dealWithFileService(ComonConstant.DIGIT_LONG_ONE, tempFilePath, Boolean.TRUE); // 将写入后的数据新增到数据记录表中 addNewRecorde(fileSaveReqDTO, fileInfoMaps , yhSystemUsers);
文件是以二进制流传递到后端的,然后需要我们自己转换为File类。
使用MultipartFile接口中提供的实现方法,我们对文件处理的操作就会变得很便捷。
MultipartFile接口方法如下:
package org.springframework.web.multipart; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import org.springframework.core.io.InputStreamSource; import org.springframework.core.io.Resource; import org.springframework.lang.Nullable; import org.springframework.util.FileCopyUtils; public interface MultipartFile extends InputStreamSource { //返回参数的名称 String getName(); // 获取源文件的名称 @Nullable String getOriginalFilename(); // 返回文件的内容类型 @Nullable String getContentType(); // 判断文件内容是否为空 boolean isEmpty(); // 返回文件大小 以字节为单位 long getSize(); // 将文件内容转化成一个byte[] 返回 byte[] getBytes() throws IOException; // 返回输入的文件流 InputStream getInputStream() throws IOException; default Resource getResource() { return new MultipartFileResource(this); } void transferTo(File var1) throws IOException, IllegalStateException; // 将MultipartFile 转换换成 File 写入到指定路径 default void transferTo(Path dest) throws IOException, IllegalStateException { FileCopyUtils.copy(this.getInputStream(), Files.newOutputStream(dest)); } }
2.MultipartFile 转File
知悉了MultipartFile 后,我们知道MultipartFile 内部提供了MultipartFile 转File.
// 临时将文件存放本地存储位置 String tempFilePath = downloadPath + File.separator + ToolsUtil.createUUID() + "_" + fileName; // 将文件写入到本地 downloadPath targetFile.transferTo(new File(tempFilePath));
同时想必大家平时也经常做过类似的处理,常见的如下操作:
public void writeFileToLocal(MultipartFile targetFile) { //开始时间 LocalDateTime startTime = LocalDateTime.now(); BufferedInputStream bufferedReader = null; BufferedOutputStream bufferedWriter = null; try { bufferedReader = new BufferedInputStream(targetFile.getInputStream()); bufferedWriter = new BufferedOutputStream(new FileOutputStream(downloadPath + File.separator +targetFile.getOriginalFilename())); int len=0; //字节缓冲区 ByteBuffer buffer = ByteBuffer.allocate(1024); while ((len = bufferedReader.read(buffer.array())) != -1) { bufferedWriter.write(buffer.array(),0,len); bufferedWriter.flush(); } LOGGER.info("writeFileToLocal ==> 耗时:" + Duration.between(startTime, LocalDateTime.now()).toMillis()); } catch (Exception e) { LOGGER.info("writeFileToLocal 文件写入失败"); }finally { if (null != bufferedReader) { try { bufferedReader.close(); } catch (IOException e) { LOGGER.info("writeFileToLocal 文件写入失败"); } } if (null != bufferedWriter) { try { bufferedWriter.close(); } catch (IOException e) { LOGGER.info("writeFileToLocal 文件写入失败"); } } } }
3.File 转 MultipartFile
概述中有讲到Spring提供了MultipartFile 接口四个实现类,我们只需将File对象传入到对应实现类的构造方法中,即可实现File 转 MultipartFile,此处提供一个案例如下所示:
File file = new File(filePath); // 文件路径 FileInputStream input = new FileInputStream(file); // File 转 MultipartFile MultipartFile targetFiles = new MockMultipartFile("targetFiles",file.getName(),null,IOUtils.toByteArray(input)); String fileName = targetFiles.getOriginalFilename(); // 源文件名
我们经常会去对路径提取文件名,以及文件类型,下面贴出集中lang3提供的常用的方法
(1).substringAfter
// 切割文件路径 获取"_"后的文件名 String textType = "Af_yta_sder.pdf"; String subRet = StringUtils.substringAfter(textType, "_"); System.out.println("subRet = " + subRet );
输出结果:
subRet = yta_sder.pdf
(2).substringAfterLast
// 获取最后一个"."切割符后的字符串 往往用作获取文件类型 String textType = "Af_yta_sder.pdf"; String subRet = StringUtils.substringAfterLast(textType, "."); System.out.println("subRet = " + subRet );
输出结果:
subRet = pdf
(3).substringBefore
// 获取"."切割符前的字符串 往往用作获取文件名 String textType = "Af_yta_sder.pdf"; String subRet = StringUtils.substringBefore(textType, "."); System.out.println("subRet = " + subRet );
输出结果:
subRet = Af_yta_sder
(4).substringBeforeLast
// 获取最后一个切割符"_"前的字符串 String textType = "Af_yta_sder.pdf"; String subRet = StringUtils.substringBeforeLast(textType, "_"); System.out.println("subRet = " + subRet );
subRet = Af_yta
其他类似的方法大同小异,此处就不一一列举了。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。