您的位置:首页 > 教育 > 锐评 > 张家界网络_制作网页模版_淘宝关键词优化_谷歌优化

张家界网络_制作网页模版_淘宝关键词优化_谷歌优化

2024/10/5 22:22:31 来源:https://blog.csdn.net/weixin_65950986/article/details/142337494  浏览:    关键词:张家界网络_制作网页模版_淘宝关键词优化_谷歌优化
张家界网络_制作网页模版_淘宝关键词优化_谷歌优化

一、前端

前端将文件分成固定大小的若干个,在Vue前端,可以使用File API和Blob对象将文件分片

// 分片上传函数
async function uploadFile(file) {const chunkSize = 5 * 1024 * 1024; // 5MB每片const totalChunks = Math.ceil(file.size / chunkSize);for (let i = 0; i < totalChunks; i++) {const start = i * chunkSize;const end = Math.min(start + chunkSize, file.size);const chunk = file.slice(start, end);// 逐个上传分片await uploadChunk(chunk, i, totalChunks);}
}// 上传分片函数
async function uploadChunk(chunk, chunkIndex, totalChunks) {const formData = new FormData();formData.append('chunk', chunk);formData.append('chunkIndex', chunkIndex);formData.append('totalChunks', totalChunks);await fetch('/api/upload', {method: 'POST',body: formData});
}
二、后端
1、分片上传

前端每一个分片通过调用upload接口上传,每个片段有个索引index

import io.minio.MinioTemplate;
import io.minio.PutObjectArgs;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import java.io.InputStream;@RestController
@RequestMapping("/api")
public class FileUploadController {@Autowiredprivate MinioTemplate minioTemplate;private final String BUCKET_NAME = "your-bucket-name";@PostMapping("/upload")public String uploadChunk(@RequestParam("chunk") MultipartFile chunk,@RequestParam("chunkIndex") int chunkIndex,@RequestParam("totalChunks") int totalChunks) {try {// 保存分片到本地或临时存储String chunkFileName = "file_part_" + chunkIndex;InputStream inputStream = chunk.getInputStream();// 将分片上传到MinIOminioTemplate.putObject(BUCKET_NAME, chunkFileName, inputStream, chunk.getSize());// 如果所有分片上传完毕,进行合并if (chunkIndex == totalChunks - 1) {mergeChunks(totalChunks);}return "Chunk uploaded successfully";} catch (Exception e) {e.printStackTrace();return "Upload failed";}}
}
2、分片合并

逐个分片上传完成之后,调用这个方法进行合并

private void mergeChunks(int totalChunks) {// 合并逻辑try {String mergedFileName = "merged_file"; // 合并后文件名// 准备分片列表List<ComposeSource> sources = new ArrayList<>();for (int i = 0; i < totalChunks; i++) {sources.add(ComposeSource.builder().bucket(BUCKET_NAME).object("file_part_" + i).build());}// 调用MinIO合并接口minioTemplate.composeObject(BUCKET_NAME, mergedFileName, sources);} catch (Exception e) {e.printStackTrace();}
}
3、断点续传
@GetMapping("/check")
public List<Integer> checkUploadedChunks(@RequestParam String fileMd5) {List<Integer> uploadedChunks = new ArrayList<>();try {// 检查存储中是否存在分片for (int i = 0; i < totalChunks; i++) {String chunkFileName = "file_part_" + i;if (minioTemplate.isObjectExist(BUCKET_NAME, chunkFileName)) {uploadedChunks.add(i);}}} catch (Exception e) {e.printStackTrace();}return uploadedChunks;
}
4、秒传

根据生成对应的md5,和minIO中的文件的MD5去对比,如果存在,直接返回域名加路径即可,不存在再执行上传

// 检查文件是否已上传
@GetMapping("/check")
public boolean checkFile(@RequestParam String fileMd5) {try {// 查询MinIO是否存在对应的文件return minioTemplate.isObjectExist(BUCKET_NAME, fileMd5);} catch (Exception e) {e.printStackTrace();return false;}
}


 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com