前端直传 OSS,分片上传、断点续传


下载OSS

npm install ali-oss或者<script src="http://gosspublic.alicdn.com/aliyun-oss-sdk-x.x.x.min.js"></script>

引入(本人npm方式)

import OSS from 'ali-oss'
实例化
    
 
  
          let ossConfig = {   //配置项
                region:that.region,
                accessKeyId:that.accessKeyId, //前端直传,没有使用后端签名(前端可以拿到OSS信息)
                accessKeySecret:that.accessKeySecret,
                bucket:that.bucket,
                secure:true
            }
            let client = new OSS(ossConfig)  //实例化OSS
            let tempCheckpoint;  //记录断点
            that.isProgressVis = true  //进度条
            
            let progress
            let index = e.file.name.lastIndexOf('.')
            let suffix = e.file.name.substring(index)
            let fileName = localStorage.getItem('platformCode')+new Date().getTime()+parseInt(Math.random()*1000)+suffix   //文件名
            // 定义上传方法。
            async function multipartUpload () {
               
                try {
                    // object-key可以自定义为文件名(例如file.txt)或目录(例如abc/test/file.txt)的形式,实现将文件上传至当前Bucket或Bucket下的指定目录。
                    let result = await client.multipartUpload(fileName, e.file, { 
                        progress: function (p, checkpoint) {
                            // 断点记录点。浏览器重启后无法直接继续上传,您需要手动触发上传操作。
                            tempCheckpoint = checkpoint
                            progress = p  //进度条进度
                            that.percentage = parseInt(p*100)
                        },
                        meta: { year: 2020, people: 'test' },
                        mime: '.mp4',
                    })
                    let data = {  //上传返回的信息
                        url:result.res.requestUrls[0].split('?')[0],
                        p: progress
                    }
                     return Promise.resolve(data)
                } catch(e){
                    return Promise.reject(e)
                }

            }

            // 开始分片上传
            multipartUpload().then(res=>{
                if(res.p!=1){
                    // this.isShowGo = true
                    //  localStorage.setItem('name',fileName)
                    //  localStorage.setItem('checkpoint',JSON.stringify(tempCheckpoint))
                }else{
                    this.list.push({
                     sectionUrl:res.url
                    })
                    this.isProgressVis = false
                    this.$message.success('上传成功')
                    this.isShows = true
                    this.showPercentage = false
                }
            }).catch(error=>{
                this.isShowGo = true
                 localStorage.setItem('name',fileName)
                 localStorage.setItem('checkpoint',JSON.stringify(tempCheckpoint))  //必须location保存断点位置
                console.log(error)
                this.$message.warning('上传失败')
            })
            //停止上传,模拟外部因素造成的上传中断
            // client.cancel()
        },
      //断点续传
        goOn(){
            let ossConfig = {
                region:this.region,
                accessKeyId:this.accessKeyId,
                accessKeySecret:this.accessKeySecret,
                bucket:this.bucket,
                secure:true
            }
            let that = this
            that.$message({
                duration:5000,
                type: 'info',
                message:'上传中,请耐心等待'
            })
            that.isProgressVis = true
            let progress
            let tempCheckpoint
            // 恢复上传。
            let resumeclient = new OSS(ossConfig);
            async function resumeUpload () {
                try {
                    let result = await resumeclient.multipartUpload(localStorage.getItem('name'), that.files[0], {
                    progress: function (p, checkpoint) {
                            tempCheckpoint = checkpoint;
                            progress = p
                        },
                        checkpoint: localStorage.getItem('checkpoint'),
                        meta: { year: 2020, people: 'test' },
                        mime: '.mp4'
                    })
                    let data = {
                        url:result.res.requestUrls[0].split('?')[0],
                        p: progress
                    }
                    return Promise.resolve(data)
                } catch (e) {
                    
                    return Promise.reject(e)
                }
            }

            resumeUpload().then(res=>{
                if(res.p==1){
                    this.list.push({
                     sectionUrl:res.url
                    })
                    this.isProgressVis = false
                    this.isShowGo = false
                    this.$message.success('上传成功')
                    this.isShows = true
                }
                
            }).catch(error=>{
                console.log(error,'续传的')
                this.$message.warning('上传失败')
            })
        },
 
 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM