写一下springmvc + vue的大文件分片上传代码,分片用MD5加密
时间: 2024-01-01 19:06:05 浏览: 40
好的,下面是SpringMVC和Vue实现大文件分片上传的代码,分片使用MD5加密:
1.前端Vue代码:
```javascript
<template>
<div>
<input type="file" @change="handleFileChange"/>
<button @click="upload">上传</button>
</div>
</template>
<script>
export default {
data () {
return {
file: null,
chunks: [],
chunkSize: 1024 * 1024 * 2, // 分片大小为2M
md5: null
}
},
methods: {
handleFileChange (event) {
this.file = event.target.files[0]
this.md5 = null
this.createChunks()
},
createChunks () { // 将文件分成多个chunk
let size = this.file.size
let chunks = []
let start = 0
let index = 0
let end = 0
while (start < size) {
end = start + this.chunkSize
if (end > size) {
end = size
}
chunks.push({
index: index,
file: this.file.slice(start, end)
})
start = end
index++
}
this.chunks = chunks
this.calculateMD5()
},
calculateMD5 () { // 计算文件的MD5值
let fileReader = new FileReader()
let self = this
fileReader.onload = function () {
let spark = new SparkMD5.ArrayBuffer()
spark.append(this.result)
self.md5 = spark.end()
}
fileReader.readAsArrayBuffer(this.file)
},
upload () { // 上传文件
let formData = new FormData()
formData.append('md5', this.md5)
formData.append('chunks', this.chunks.length)
this.chunks.forEach((chunk, index) => {
formData.append('chunk-' + index, chunk.file)
})
// 使用axios发送formData到后端
axios.post('/upload', formData).then(response => {
console.log(response.data)
})
}
}
}
</script>
```
2.后端SpringMVC代码:
```java
@RestController
public class FileController {
@RequestMapping(value = "/upload", method = RequestMethod.POST, consumes = "multipart/form-data")
public void upload(@RequestParam("md5") String md5, @RequestParam("chunks") Integer chunks,
@RequestParam(value = "chunk-0", required = false) MultipartFile file0,
@RequestParam(value = "chunk-1", required = false) MultipartFile file1,
@RequestParam(value = "chunk-2", required = false) MultipartFile file2,
// ...
@RequestParam(value = "chunk-" + (chunks - 1), required = false) MultipartFile fileN) {
// 将分片文件按照索引顺序合并成一个完整的文件
List<MultipartFile> fileList = new ArrayList<>();
for (int i = 0; i < chunks; i++) {
MultipartFile part = request.getFile("chunk-" + i);
fileList.add(part);
}
Collections.sort(fileList, (o1, o2) -> {
String n1 = o1.getOriginalFilename().split("-")[1];
String n2 = o2.getOriginalFilename().split("-")[1];
return Integer.parseInt(n1) - Integer.parseInt(n2);
});
byte[] data = null;
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
for (MultipartFile part : fileList) {
bos.write(part.getBytes());
}
data = bos.toByteArray();
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
// 验证文件MD5值是否一致
String md5OfFile = DigestUtils.md5Hex(data);
if (md5OfFile.equals(md5)) {
// 文件上传成功,保存到服务器
// ...
} else {
// 文件上传失败,返回错误信息
// ...
}
}
}
```
这样就实现了大文件分片上传,并且对上传的文件进行了MD5加密验证。