阿里雲 oss (圖片、視頻上傳)

示例:

  1. 前端封裝方法並調用,直接上傳至阿里雲
    此方法需要在阿里雲擁有賬號,並配置好纔可使用,配置就不貼出了,只貼出前端代碼。
/**
*
* 阿里雲 oss (圖片、視頻上傳) 插件
*
* @param opts 參數詳情
* opts = {
*  timeout:"請求過期時間(配置項 timeout, 默認 60000)",
*  partSize:"分片大小(配置項 partSize, 默認 1048576)",
*  parallel:"上傳分片數(配置項 parallel, 默認 5)",
*  retryCount:"網絡失敗重試次數(配置項 retryCount, 默認 3)",
*  retryDuration:"網絡失敗重試間隔(配置項 retryDuration, 默認 2)",
*  region:"配置項 region, 默認 cn-shanghai",
*  userId:"阿里雲賬號ID,默認1111",
*  stsUrl:"獲取stsToken的地址",
*  videoInfoUrl:"獲取視頻信息的地址",
*  cateId:“視頻分類id”,
*
*  addFileSuccess:"添加文件成功回調",
*  onUploadstarted:"開始上傳的回調",
*  onUploadSucceed:"成功上傳的回調",
*  onUploadFailed:"上傳失敗的回調",
*  onUploadCanceled:"取消上傳的回調",
*  onUploadProgress:"上傳過程回調",
*  onUploadEnd:""上傳完成回調
* }
 */
jQuery.fn.extend({
    aliyunUploader: function (opts,callback) {
        var stsUrl = opts.stsUrl;
        var videoInfoUrl = opts.videoInfoUrl;
        if(!stsUrl){
                stsUrl = 'https://xx.xxxx.com/upload/oss/createSecurityToken';
        }
        if(!videoInfoUrl){
                videoInfoUrl = 'https://xx.xxxx.com/upload/oss/getVideoInfo';
        }

        const _this = this;

        var dtd = $.Deferred();

        var wait = function(dtd){
            // 獲取頁面所有的script標籤
            var scripts = document.getElementsByTagName("script");

            // 匹配當前js路徑
            var url;
            for (var i = 0;i < scripts.length; i++){
                url = scripts[i].src;
                if(url.indexOf("aliyunUpload.js") != -1) break;
            }
            var path = url.replace('aliyunUpload.js','');

            var urls = [
                path + "lib/aliyun-upload-sdk/aliyun-upload-sdk-1.5.0.min.js",
                path + "lib/aliyun-upload-sdk/lib/es6-promise.min.js",
                path + "lib/aliyun-upload-sdk/lib/aliyun-oss-sdk-5.3.1.min.js"
            ];
            var sta = 0;
            // 加載js
            var loadScript = function () {
                $.getScript(urls[sta],function(data, textStatus, jqxhr){
                    sta += textStatus == 'success'?1:0;
                    if(sta == 3){
                        console.log("JS success!");
                        dtd.resolve();
                    }else {
                        loadScript();
                    }
                });
            };
            loadScript();

            return dtd;
        };

        $.when(wait(dtd)).done(function(){
            var uploader = new AliyunUpload.Vod({
                timeout: opts.timeout || 60000,
                partSize: opts.partSize || 1048576,
                parallel: opts.parallel || 5,
                retryCount: opts.retryCount || 3,
                retryDuration: opts.retryDuration || 2,
                region: opts.region || 'cn-shanghai',
                userId: opts.userId || '1111',
                // 添加文件成功
                addFileSuccess: function (uploadInfo) {
                    console.log('添加文件成功...');
                    if(opts.addFileSuccess) opts.addFileSuccess(uploadInfo);
                },
                // 開始上傳
                onUploadstarted: function (uploadInfo) {
                    // 如果是 STSToken 上傳方式, 需要調用 uploader.setUploadAuthAndAddress 方法
                    // 用戶需要自己獲取 accessKeyId, accessKeySecret,secretToken
                    // 下面的 URL 只是測試接口, 用於獲取 測試的 accessKeyId, accessKeySecret,secretToken
                    $.get(stsUrl, function (data) {
                        var accessKeyId = data.accessKeyId;
                        var accessKeySecret = data.accessKeySecret;
                        var secretToken = data.securityToken;
                        uploader.setSTSToken(uploadInfo, accessKeyId, accessKeySecret, secretToken)
                    }, 'json');
                    console.log('文件開始上傳...');
                    console.log("onUploadStarted:" + uploadInfo.file.name + ", endpoint:" +
                        uploadInfo.endpoint + ", bucket:" + uploadInfo.bucket + ", object:" + uploadInfo.object);

                    if(opts.onUploadstarted) opts.onUploadstarted(uploadInfo)
                },
                // 文件上傳成功
                onUploadSucceed: function (uploadInfo) {
                    console.log("onUploadSucceed: " + uploadInfo.file.name + ", endpoint:" + uploadInfo.endpoint +
                        ", bucket:" + uploadInfo.bucket + ", object:" + uploadInfo.object);
                    console.log('文件上傳成功!');

                    // 獲取視頻信息
                    $.get(videoInfoUrl,{
                        vid:uploadInfo.videoId,
                        fileHashCode: uploadInfo.fileHash
                    }, function (data) {
                        if(opts.onUploadSucceed) opts.onUploadSucceed(data)
                    }, 'json');

                },
                // 文件上傳失敗
                onUploadFailed: function (uploadInfo, code, message) {
                    console.log("onUploadFailed: file:" + uploadInfo.file.name + ",code:" + code + ", message:" + message);
                    console.log('文件上傳失敗!');
                    if(opts.onUploadFailed) opts.onUploadFailed(uploadInfo, code, message)
                },
                // 取消文件上傳
                onUploadCanceled: function (uploadInfo, code, message) {
                    console.log("Canceled file: " + uploadInfo.file.name + ", code: " + code + ", message:" + message);
                    console.log('文件已取消上傳!');
                    if(opts.onUploadCanceled) opts.onUploadCanceled(uploadInfo, code, message)
                },
                // 文件上傳進度,單位:字節, 可以在這個函數中拿到上傳進度並顯示在頁面上
                onUploadProgress: function (uploadInfo, totalSize, progress) {
                    console.log("onUploadProgress:file:" + uploadInfo.file.name +
                        ", fileSize:" + totalSize + ", percent:" + Math.ceil(progress * 100) + "%");
                    if(opts.onUploadProgress) opts.onUploadProgress(uploadInfo, totalSize, progress)
                },
                // 上傳憑證超時
                onUploadTokenExpired: function (uploadInfo) {
                    // 如果是上傳方式二即根據 STSToken 實現時,從新獲取STS臨時賬號用於恢復上傳
                    // 上傳文件過大時可能在上傳過程中 sts token 就會失效, 所以需要在 token 過期的回調中調用 resumeUploadWithSTSToken 方法
                    // 這裏是測試接口, 所以我直接獲取了 STSToken
                    console.log('文件上傳超時!');

                    $.get(stsUrl, function (data) {
                        var accessKeyId = data.accessKeyId;
                        var accessKeySecret = data.accessKeySecret;
                        var secretToken = data.securityToken;
                        uploader.setSTSToken(uploadInfo, accessKeyId, accessKeySecret, secretToken)
                    }, 'json')
                },
                // 全部文件上傳結束
                onUploadEnd: function (uploadInfo) {
                    console.log("onUploadEnd: uploaded all the files");
                    if(opts.onUploadEnd) opts.onUploadEnd(uploadInfo)
                }
            });

            /** 綁定事件 */
            $(_this).on('change', function (e) {
                console.log(e.target.files)
                var file = e.target.files[0];
                if (!file) {
                    alert("請先選擇需要上傳的文件!");
                    return
                }

                // 用戶信息設置
                var userData = {
                    Vod:{
                        Title: file.name,
                        FileName: file.name,
                        CateId: opts.cateId || "1111111"
                    }
                };
                uploader.cleanList();// 清理掉,不然會上傳之前添加的文件
                // 首先調用 uploader.addFile(event.target.files[i], null, null, null, userData)
                uploader.addFile(file, null, null, null, JSON.stringify(userData))
            });

            callback(uploader)
        }).fail(function(){
            console.log("上傳器創建失敗!");
        });
    }
});



//調用
$(obj).aliyunUploader({// 具體參數設置看註釋
	cateId: "11111111",
	onUploadSucceed: function (data) {// 成功回調
	     console.log("result:"+ data);
	},
	addFileSuccess: function (data) {// 添加文件成功回調
	    console.log("result:"+ data);
	    //在此觸發開始上傳事件,例如:
	     $(obj2).click(function() {
	          uploader.startUpload();// 開始上傳
	     })
	},
	onUploadFailed: function(){//上傳視頻回調
	    alert('視頻上傳失敗!');
	}
},function (data) {
	uploader = data;
});
  1. 封裝公共方法實例化上傳對象
;(function($){
    $.fn.extend({
        /**
         * 視頻上傳
         * @param {int} water 是否水印,默認false不加水印 預留,暫無效
         * @returns {uploadVideo}
         */
        uploadVideo: function(water) {
            var water = water || false;
            var uploadObject = this;
            /*this.userData = '{"Vod":{"UserData":"{"IsShowWaterMark":'+water+',"Priority":"7"}"}}';*/
            this.authData = {
                UploadAddress: "",
                VideoId: "",
                RequestId: "",
                UploadAuth: "",
            };
            //各種狀態的回調
            this._progressCallBack = null;
            this._uploadedCallBack = null;
            this._errorCallBack = null;
            this._uploadBeforeCallBack = null;
 
            /**
             * 設置圖片上傳成功後的回調方法
             * @param {function} fn 回調方法
             * @returns {upload_files}
             * @private
             */
            this.setUploaded = function (fn) {
                this._uploadedCallBack = fn;
                return this;
            };
            /**
             * 設置進度回調
             * @param fn
             * @returns {upload}
             */
            this.setProgress = function (fn) {
                this._progressCallBack = fn;
                return this;
            };
            /**
             * 設置開始上傳前的回調方法
             * @param {function} fn 回調方法
             * @returns {upload_files}
             * @private
             */
            this.setUploadBefore = function (fn) {
                this._uploadBeforeCallBack = fn;
                return this;
            };
            /**
             * 上傳失敗後的回調方法
             * @param {function} fn 回調方法
             * @returns {upload_files}
             */
            this.setError = function (fn) {
                this._errorCallBack = fn;
                return this;
            };
            this.run = function () {
                uploadObject[0].addEventListener ? uploadObject[0].addEventListener("change", this._bindSelectFileEvent, false) : uploadObject[0].attachEvent('onChange', this._bindSelectFileEvent);
            };
            this._bindSelectFileEvent = function (event) {
                if( event.target.files.length > 1 ){
                    alert('只支單視頻上傳');
                    return false;
                }
                var file = event.target.files[0];
 
                if(file.filename == '' || file.filesize == '') {
                    alert('視頻上傳錯誤');
                    return false;
                }
 
                if( file.type.indexOf('video') == -1) {
                    alert('請上傳視頻格式文件');
                    return false;
                }
 
                $.getJSON(siteroot + '/share/ajax.html?action=getVideoPlayAuth&inajax=1',{filename:file.name,filesize:file.size}, function (resp) {
                    console.log(resp);
                    if(resp.s<0) {
                        alert(resp.message);
                        return false;
                    }
                    uploadObject.authData = resp.data;
                    console.log(resp.data);
                    var uploader = new AliyunUpload.Vod({
                        //分片大小默認1M,不能小於100K
                        partSize: 1048576,
                        //並行上傳分片個數,默認5
                        parallel: 5,
                        //網絡原因失敗時,重新上傳次數,默認爲3
                        retryCount: 3,
                        //網絡原因失敗時,重新上傳間隔時間,默認爲2秒
                        retryDuration: 2,
                        userId : '',
                        // 開始上傳
                        'onUploadstarted': function (uploadInfo) {
                            console.log("onUploadStarted:" + uploadInfo.file.name)
                            uploader.setUploadAuthAndAddress(uploadInfo, uploadObject.authData.UploadAuth, uploadObject.authData.UploadAddress,uploadObject.authData.VideoId);
                        },
                        // 文件上傳成功
                        'onUploadSucceed': function (uploadInfo) {
                            if( $.isFunction(uploadObject._uploadedCallBack) ){
                                uploadInfo.VideoId = uploadObject.authData.VideoId;
                                uploadObject._uploadedCallBack(uploadInfo);
                            }
                        },
                        // 文件上傳失敗
                        'onUploadFailed': function (uploadInfo, code, message) {
                            if( $.isFunction(uploadObject._errorCallBack) ){
                                uploadObject._errorCallBack(uploadInfo, code, message);
                            }
                        },
                        // 文件上傳進度,單位:字節
                        'onUploadProgress': function (uploadInfo, totalSize, uploadedSize) {
                            if( $.isFunction(uploadObject._progressCallBack) ){
                                uploadObject._progressCallBack(uploadInfo, totalSize, uploadedSize);
                            }
                        },
                        // 上傳憑證超時
                        'onUploadTokenExpired': function () {
                            uploader.resumeUploadWithAuth(uploadObject.authData.UploadAuth);
                        }
                    });
                    var userData = {
                        Vod: {
                            UserData: {
                                IsShowWaterMark: false,
                                Priority: 7
                            }
                        }
                    };
                    uploader.addFile(file, null, null, null, JSON.stringify(userData));
                    /*uploader.addFile(file, null, null, null, uploadObject.userData);*/
                    //開始上傳之前執行某個操作
                    if( $.isFunction(uploadObject._uploadBeforeCallBack) ){
                        uploadObject._uploadBeforeCallBack();
                    }
                    uploader.startUpload();
 
                });
                return this;
            };
            return this;
        }
 
    });
})(jQuery);

注:第一種方式是小編正在使用的,第二種是網上查找到的,未進行驗證。

官網地址:https://help.aliyun.com/document_detail/112718.html?spm=a2c4g.11186623.6.1431.270e7eaepYPAC4

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章