前端直傳 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