场景
前端上传文件过大时,超出服务器每次传输最大值,可以实现分片上传。
原理
前端将大文件进行切割,然后根据文件数量,请求相应次数,加入临时文件中,如下所示,最后一次,后端可以跟据所传参数判断是不是最后一块,是的话就返回文件路径。
代码实现
请求参数:
class MultipartFileParam { //文件唯一标识 private String md5; //文件块的序号 private int index; //文件块大小 private long size; //文件块 private MultipartFile file; //文件总块数 private int totalChunks; }
public class ChunkFileModelVO { private int index; private String filePath; }
public ChunkFileModelVO chunkUpload(MultipartFileParam param) throws IOException { ChunkFileModelVO chunkFileModelVO = new ChunkFileModelVO(); String tempDir = FrameConfig.getTempFile(); File tempFile = new File(tempDir, param.getMd5()); chunkFileModelVO.setIndex(param.getIndex()); Throwable var6; try { RandomAccessFile raf = new RandomAccessFile(tempFile, "rw"); var6 = null; try { FileChannel fileChannel = raf.getChannel(); long position = (long)(param.getIndex() - 1) * param.getSize(); byte[] fileData = param.getFile().getBytes(); fileChannel.position(position); fileChannel.write(ByteBuffer.wrap(fileData)); fileChannel.force(true); fileChannel.close(); } catch (Throwable var37) { var6 = var37; throw var37; } finally { if (raf != null) { if (var6 != null) { try { raf.close(); } catch (Throwable var36) { var6.addSuppressed(var36); } } else { raf.close(); } } } } catch (IOException var41) { log.error(var41.getMessage(), var41); } if (param.getIndex() == param.getTotalChunks()) { InputStream input = Files.newInputStream(tempFile.toPath()); String uploadPath = FrameConfig.getUploadPath(); MultipartFile file = new MockMultipartFile("file", tempFile.getName(), "text/plain", IOUtils.toByteArray(input)); String filePath = FileUploadUtils.upload(uploadPath, file); chunkFileModelVO.setFilePath(filePath); tempFile.delete(); } return chunkFileModelVO; }