前端实现大文件分片上传(切片上传)

实现方式:

1、将文件切分为固定大小的块(通常为几MB),使用File API中的slice方法来进行切片。

2、给每个分片设定唯一的标识符

3、分片逐个上传。

upFile (data) {
    let { file } = data
    let maxSize =  20 * 1024 *1024
    if (file.size > maxSize) {
        let shardCount = Math.ceil(file.size / maxSize)
        let md5 = this.guid()

        for(let i = 0; i < shardCount; i++) {
            let form = new FormData()

            // 唯一id
            form.append('fileMd5', md5)
            // 文件名
            form.append('fileName', file.name)
            // 总大小
            form.append('fileSize', file.size)
            // 每一片的大小
            form.append('size', maxSize)
            // 总片数
            form.append('chunkTotal', shardCount)
            // 计算每一片的起始与结束位置
            let start = i * maxSize
            let end = Math.min(file.size, start + maxSize)
            // slice方法用于切出文件的一部分
            form.append('file', file.slice(start, end))
            // 当前是第几片
            form.append('chunk', i)
            // 上传来源
            form.append('fileResource', 4)
            // 每个分片的MD值
            form.append('chunkMd5', this.guid())
            // 大文件上传接口
            this.bigUpload(form)
        }
    } else {
        const formData = new FormData()
        formData.append('file', file)
        formData.append('fileName', file.name)
        formData.append('fileResource', 4)
        formData.append('fileSize', file.size)
        this.$api.dataReport.uploadFile(formData ).then((res)=>{
            if(res.code==='000000'){
                //上传成功!
            }
        })
    }
},
bigUpload (form) {
    this.$api.dataReport.uploadBigFile(form).then((res)=>{
        if(res.code==='000000'){
            //上传成功!
        }
    })
},
guid () {
     return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
         let r = Math.random() * 16 | 0,v = c === 'x' ? r : r & 0x3 | 0x8
         return v.toString(32)
     })
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现文件分片可以分为两个部分,前端代码和后端代码。以下是一个简单的 Spring Boot 后端实现示例: 1. 前端代码 前端代码主要负责将大文件切分为多个小文件,并将这些小文件逐个上到后端。以下是一个简单的前端代码实现示例: ```javascript // 文件切片大小 const CHUNK_SIZE = 1024 * 1024; // 分片 async function uploadFile(file) { const fileSize = file.size; const chunks = Math.ceil(fileSize / CHUNK_SIZE); // 分片 for (let i = 0; i < chunks; i++) { const start = i * CHUNK_SIZE; const end = Math.min(start + CHUNK_SIZE, fileSize); const chunk = file.slice(start, end); await uploadChunk(file.name, i, chunk); } // 合并文件 await mergeFile(file.name, chunks); } // 上单个分片 async function uploadChunk(filename, index, chunk) { const formData = new FormData(); formData.append('file', chunk, `${filename}-${index}`); await axios.post('/api/upload/chunk', formData, { headers: { 'Content-Type': 'multipart/form-data' } }); } // 合并文件 async function mergeFile(filename, chunks) { await axios.post('/api/upload/merge', { filename, chunks }); } ``` 2. 后端代码 后端代码主要负责将上的小文件合并为完整的大文件,并保存到服务器上。以下是一个简单的后端代码实现示例: ```java @RestController @RequestMapping("/api/upload") public class UploadController { @PostMapping("/chunk") public void uploadChunk(@RequestParam("file") MultipartFile chunk) throws IOException { // 保存分片文件到临时目录 Path tempDir = Paths.get(System.getProperty("java.io.tmpdir")); Path tempFile = tempDir.resolve(chunk.getOriginalFilename()); Files.write(tempFile, chunk.getBytes(), StandardOpenOption.CREATE, StandardOpenOption.APPEND); } @PostMapping("/merge") public void mergeFile(@RequestBody Map<String, Object> params) throws IOException { String filename = (String) params.get("filename"); int chunks = (int) params.get("chunks"); // 合并分片文件 Path tempDir = Paths.get(System.getProperty("java.io.tmpdir")); Path tempFile = tempDir.resolve(filename); try (OutputStream out = Files.newOutputStream(tempFile, StandardOpenOption.CREATE)) { for (int i = 0; i < chunks; i++) { Path chunkFile = tempDir.resolve(filename + "-" + i); Files.copy(chunkFile, out); Files.delete(chunkFile); } } // 保存完整文件到指定位置 Path targetDir = Paths.get("path/to/target/dir"); Path targetFile = targetDir.resolve(filename); Files.move(tempFile, targetFile, StandardCopyOption.REPLACE_EXISTING); } } ``` 上述代码将分片文件保存到临时目录中,并在所有分片完成后将它们合并为完整的文件。最后,将完整文件保存到指定位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值