admin 管理员组

文章数量: 887021

文件上传

单个文件上传

第一种方法:

/*** * @param file         需要上传的文件* @param baseUrl      上传地址* @param uploadName   上传文件如果要更改文件名称,该字段为要更改的名称,不需要更改则该参数应为空字符串或null*/public static void upload(MultipartFile file,String baseUrl,String uploadName){// 1、获取文件的原始文件名, 通过原始文件名获取文件后缀 例如:abc.jpgString originalFilename = file.getOriginalFilename();//后缀文件类型。如:.txt   .pngString suffix = originalFilename.substring(originalFilename.lastIndexOf("."));//文件前缀名称String prefixName = originalFilename.substring(0, originalFilename.lastIndexOf("."));// 2、使用UUID重新生成文件名,防止文件名称重复造成文件覆盖String fileName = "";if (StringUtils.isNotEmpty(uploadName)){fileName = uploadName + suffix;}else {fileName = originalFilename;}// 3、创建一个目录对象File dir = new File(baseUrl);//判断当前目录是否存在if (!dir.exists()) {boolean mkdirs = dir.mkdirs();if (!mkdirs) {throw new CommonException(CommonCode.FILE_UPDATE_ERROR);}}try {// 4、将临时文件转存到指定位置file.transferTo(new File(baseUrl+File.separator + fileName));} catch (IOException e) {e.printStackTrace();}}

第二种方法:

 public void upload(@RequestParam("file")MultipartFile file ){try {// 1、获取文件的原始文件名, 通过原始文件名获取文件后缀 例如:abc.jpgString originalFilename = file.getOriginalFilename();//后缀文件类型。如:.txt   .pngString suffix = originalFilename.substring(originalFilename.lastIndexOf("."));//文件前缀名称String prefixName = originalFilename.substring(0, originalFilename.lastIndexOf("."));//TODO 要上传的文件地址,应从配置文件或者数据库中读取。本地测试时可以写 :D:\\uploadFileString resultUrl = "";// 2、创建一个目录对象File dir = new File(resultUrl);//判断当前目录是否存在if (!dir.exists() || (!dir.isDirectory())) {dir.mkdirs();}//3、若文件已存在,重命名为历史文件File uploadFile = new File(resultUrl+ File.separator+ originalFilename);//数据入库if (uploadFile.exists()){String rename =  "重命名后的名称";File renameFile = new File(resultUrl+File.separator+prefixName+"-"+rename+suffix);com.google.common.io.Files.copy(uploadFile,renameFile);}// 4、将临时文件转存到指定位置file.transferTo(uploadFile);}catch (Exception e){e.printStackTrace();}}

如果上述代码出现:com.google.common.io找不到

请在pom.xml文件中加入一下配置:

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>27.0-jre</version>
</dependency>

多个文件单个字段上传(就是多次调用单个文件上传):

    /*** 多个文件单个字段上传:例如:file : [logo.jpg , name.txt]* @param files* @param baseUrl*/public static void uploadFiles(MultipartFile[] files,String baseUrl,String uploadName){for (MultipartFile file : files) {upload(file,baseUrl,uploadName);}}

 多个文件多个字段上传:

在apifox中测试应该为:

 /*** 多个文件多字段上传。例如: file1:logo.png , file2:name.txt* @param request*/public static void uploadFiles(MultipartHttpServletRequest request){CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());if (multipartResolver.isMultipart(request)){//上传多个文件,每个字段一个文件Iterator<String> fileNames = request.getFileNames();while (fileNames.hasNext()){//取得上传的文件String uploadName = fileNames.next();MultipartFile file = request.getFile(uploadName);if (file != null){String projectPath = request.getSession().getServletContext().getRealPath("/");String originalFilename = file.getOriginalFilename();String temFile = projectPath + System.currentTimeMillis() + "_" + originalFilename;File targetFile = new File(temFile);try {file.transferTo(targetFile);}catch (IOException e){e.printStackTrace();}}}}}

注意:

在调用多个文件多个字段的方法时如果出现java.lang.ClassNotFoundException: org.apache.commons.fileupload.disk.DiskFileItemFactory的解决方法:

 如果出现以上错误,请在pom.xml中引入

<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.2.1</version>
</dependency>

本文标签: 文件上传