当前位置:首页 > VUE

vue java实现分片上传

2026-01-20 08:13:11VUE

分片上传的实现原理

分片上传是将大文件分割成多个小块分别上传,最后在服务器合并的技术。这种方式能解决大文件上传超时、网络不稳定等问题,同时支持断点续传。

前端Vue实现

前端需要使用File API将文件切片,并通过axios发送分片请求。核心代码示例:

// 文件切片
function createFileChunks(file, chunkSize = 5 * 1024 * 1024) {
  const chunks = []
  let cur = 0
  while (cur < file.size) {
    chunks.push(file.slice(cur, cur + chunkSize))
    cur += chunkSize
  }
  return chunks
}

// 上传分片
async function uploadChunks(chunks, fileMd5) {
  const requests = chunks.map((chunk, index) => {
    const formData = new FormData()
    formData.append('file', chunk)
    formData.append('chunkIndex', index)
    formData.append('fileMd5', fileMd5)
    return axios.post('/api/upload/chunk', formData)
  })
  await Promise.all(requests)
}

后端Java实现

Spring Boot后端需要处理分片上传和合并逻辑。关键代码示例:

@PostMapping("/upload/chunk")
public ResponseEntity<?> uploadChunk(
    @RequestParam("file") MultipartFile file,
    @RequestParam("chunkIndex") int chunkIndex,
    @RequestParam("fileMd5") String fileMd5) {

    String chunkDir = "uploads/chunks/" + fileMd5 + "/";
    new File(chunkDir).mkdirs();

    String chunkPath = chunkDir + chunkIndex;
    file.transferTo(new File(chunkPath));

    return ResponseEntity.ok().build();
}

@PostMapping("/merge")
public ResponseEntity<?> mergeChunks(
    @RequestParam("fileName") String fileName,
    @RequestParam("fileMd5") String fileMd5,
    @RequestParam("totalChunks") int totalChunks) {

    String chunkDir = "uploads/chunks/" + fileMd5 + "/";
    String outputPath = "uploads/" + fileName;

    try (FileOutputStream fos = new FileOutputStream(outputPath)) {
        for (int i = 0; i < totalChunks; i++) {
            File chunkFile = new File(chunkDir + i);
            Files.copy(chunkFile.toPath(), fos);
            chunkFile.delete();
        }
        new File(chunkDir).delete();
    }

    return ResponseEntity.ok().build();
}

进度监控实现

前端可以通过axios的onUploadProgress回调实现进度显示:

const config = {
  onUploadProgress: progressEvent => {
    const percent = Math.round(
      (progressEvent.loaded * 100) / progressEvent.total
    )
    console.log(`上传进度: ${percent}%`)
  }
}
axios.post('/api/upload/chunk', formData, config)

断点续传实现

后端需要记录已上传的分片信息:

vue java实现分片上传

@GetMapping("/upload/progress")
public ResponseEntity<?> getUploadProgress(
    @RequestParam("fileMd5") String fileMd5) {

    String chunkDir = "uploads/chunks/" + fileMd5 + "/";
    File dir = new File(chunkDir);
    if (!dir.exists()) {
        return ResponseEntity.ok(Collections.emptyList());
    }

    return ResponseEntity.ok(Arrays.stream(dir.listFiles())
        .map(f -> Integer.parseInt(f.getName()))
        .collect(Collectors.toList()));
}

注意事项

文件MD5计算应在前端完成,作为文件唯一标识。分片大小建议设置为1-5MB。后端需要做好并发控制和错误处理,确保分片上传的原子性。

标签: 分片上传
分享给朋友:

相关文章

vue实现上传表哥

vue实现上传表哥

Vue 实现上传表格 在 Vue 中实现上传表格功能,通常涉及文件上传、文件解析(如 Excel 或 CSV)以及数据展示。以下是具体实现方法: 使用 Element UI 上传组件 Element…

vue实现图片裁剪上传

vue实现图片裁剪上传

Vue 实现图片裁剪上传的方法 使用 vue-cropper 库 安装 vue-cropper 库: npm install vue-cropperjs 引入组件并设置基本配置: import V…

vue实现上传功能

vue实现上传功能

实现文件上传功能 在Vue中实现文件上传功能可以通过结合HTML的<input type="file">元素和JavaScript的FormData对象来完成。以下是一个基本的实现方法:…

vue实现excel上传预览

vue实现excel上传预览

vue实现excel上传预览的方法 使用xlsx库解析Excel文件 安装xlsx库来处理Excel文件: npm install xlsx 在Vue组件中引入xlsx库: import * as…

Vue实现头像截取上传

Vue实现头像截取上传

Vue实现头像截取上传的方法 使用Vue实现头像截取上传功能,可以通过以下步骤完成。主要依赖第三方库vue-cropper或cropperjs实现图像裁剪功能,结合文件上传逻辑完成整个流程。 安装依…

vue实现拍摄视频上传

vue实现拍摄视频上传

Vue实现拍摄视频上传的方法 使用HTML5的<input type="file">和capture属性 在Vue模板中添加一个文件输入元素,通过capture属性指定使用摄像头拍摄视频:…