1.导入阿帕奇关于断点续传的依赖
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version> 1.4</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
具体代码
仅展示Controller层
@RestController public class UploadAndDownLoad { @PostMapping("/upload") public void upload(HttpServletRequest request, HttpServletResponse response) throws Exception { //分片 response.setCharacterEncoding("utf-8"); //第几个分片 Integer schunk = null; //所有分片的数量 Integer schunks = null; //分片的名称 String name = null; //上传文件的目录 File upLoadPath = new File("D:\\file"); BufferedOutputStream outputStream = null; DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(); //设置缓冲区的大小,我们的文件不是一次性直接写入磁盘中的,而是分批写入缓冲区再一次性写入磁盘 diskFileItemFactory.setSizeThreshold(1024); //设置一个临时目录 diskFileItemFactory.setRepository(upLoadPath); //将设置好的 ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory); servletFileUpload.setFileSizeMax(5l * 1024l * 1024l * 1024l); servletFileUpload.setSizeMax(10l * 1024l * 1024l * 1024l); List<FileItem> fileItems = servletFileUpload.parseRequest(request); //先取出来三个重要参数 for (FileItem fileItem : fileItems) { //如果fileTem不是文件对象而是一个表单域 if (fileItem.isFormField()) { if (fileItem.getFieldName() != null) { if ("chunk".equals(fileItem.getFieldName())) { String string = fileItem.getString("utf-8"); schunk = Integer.valueOf(string); } if ("chunk".equals(fileItem.getFieldName())) { String string = fileItem.getString("utf-8"); schunks = Integer.valueOf(string); } if ("chunk".equals(fileItem.getFieldName())) { name = fileItem.getString("utf-8"); } } } } //先取出来三个重要参数 for (FileItem fileItem : fileItems) { String temptFileName = name; //如果不是表单域而是文件域 if (!fileItem.isFormField()) { if (name != null) { if (schunk != null) { temptFileName = schunk + "_" + name; } File temFile = new File(upLoadPath, temptFileName); if (!temFile.exists()) { //断点续传,如果网络中断会重新上传,还要再判断是否上传过 fileItem.write(temFile); } } } } //现在将文件全部写入磁盘后,将所有文件进行合并 //在合并之前需要判断一下是否有分片,而且要知道是否是最后一个分片保证完整性 if (schunk != null && schunk.intValue() == schunks.intValue() - 1) { File tempFile = new File(upLoadPath, name); outputStream = new BufferedOutputStream(new FileOutputStream(tempFile)); for (int i = 0; i < schunks; i++) { File file = new File(upLoadPath, i + "_" + name); //多个分片上传要注意最后一个分片到了并不意味着前面的分片也到了 while (!file.exists()) { Thread.sleep(100); } byte[] bytes = FileUtils.readFileToByteArray(file); outputStream.write(bytes); outputStream.flush(); file.delete(); } outputStream.flush(); } response.getWriter().write("文件上传成功——" + name); } }