123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326 |
- (function KS3_UPLOAD(win) {
- var JSY={
- host:'http://ks3-cn-beijing.ksyun.com/teaseyoulearn',
- fileToBeUpload:'',
- };
- JSY.Config=function(opt){
- var opt=opt || {};
- Ks3.config.AK = opt.ak || '+vB0RuO22DeeanAAb0ig'; //TODO: 请替换为您的AK
- Ks3.config.SK = opt.sk || '3kbTp8pg+LymO84/ZyxG/od/3FeVDjWt+8/m5iBc'; //TODO: 测试时请填写您的secret key
- Ks3.config.region = 'BEIJING'; //TODO: 需要设置bucket所在region, 如杭州region: HANGZHOU,北京region:BEIJING,香港region:HONGKONG,上海region: SHANGHAI ,美国region:AMERICA ;如果region设置和实际不符,则会返回301状态码; region的endpoint参见:http://ks3.ksyun.com/doc/api/index.html
- Ks3.config.bucket = opt.bucket_name || 'teaseyoulearn'; // TODO : 设置默认bucket name
- Ks3.config.protocol=window.location.protocol === 'https:' ? 'https' : 'http';
- Ks3.config.baseUrl=Ks3.ENDPOINT[Ks3.config.region];
- window.Ks3Host=Ks3.config.protocol + '://' + Ks3.config.baseUrl+ '/' + Ks3.config.bucket;
- }
- JSY.upload=function(opt,successFn,errorFn){
- var opt=opt || {};
- var ks3Options = {
- KSSAccessKeyId: Ks3.config.AK,
- signature: opt.signature || '',
- bucket_name: Ks3.config.bucket,
- key: (opt.dirname || 'image')+'/${filename}',
- acl: "public-read",
- uploadDomain: Ks3.config.protocol + '://' + Ks3.config.baseUrl+ '/' + Ks3.config.bucket,
- autoStart: opt.autoStart || true,
- onFilesAddedCallBack:function (uploader,obj) {
- opt.FileAdd && opt.FileAdd(uploader,obj);
- },
- onErrorCallBack:function (uploader, errObject) {
- errorFn && errorFn(uploader,errObject);
- },
- onFileUploadedCallBack:function (uploader,obj) {
- successFn && successFn(uploader,obj);
- }
- };
- var uploader=new ks3FileUploader(ks3Options,{
- browse_button:opt.browse_button || 'browse',
- flash_swf_url :'/public/pc/ks3-js-sdk/src/Moxie.swf',
- silverlight_xap_url : '/public/pc/ks3-js-sdk/src/Moxie.xap',
- filters:{
- mime_types:[
- { title : "Image files", extensions : "jpg,gif,png" },
- { title : "Video files", extensions : "mp4,mov,qt,ts,rmvb,rm,avi,flv,mkv,wmv,mpg,mpeg,m2v,m4v,3gp,3g2,webm,vob,ogv,ogg" }
- ],
- prevent_duplicates:true,
- max_file_size:'2gb',
- },
- multi_selection:opt.max_length || false,
- });
- return uploader;
- }
- JSY.LoadEvent=function(){
- $('.upload-image-box').on({
- mouseover:function () {
- $(this).find('.mask').show();
- },
- mouseout:function () {
- $(this).find('.mask').hide();
- }
- })
- $('.open_image').on('click',function () {
- $eb.openImage($(this).data('url'));
- });
- }
- JSY.getImgBoxHtml=function ($name,inputname) {
- var host=this.host+'/'+$name,inputname=inputname || 'image';
- return '<div class="upload-image-box">\n' +
- ' <img src="'+host+'" alt="">\n' +
- ' <input type="hidden" name="'+inputname+'" value="'+host+'">\n' +
- ' <div class="mask">\n' +
- ' <p><i class="fa fa-eye open_image" data-url="'+host+'"></i><i class="fa fa-trash-o delete_image" data-url="'+$name+'"></i></p>\n' +
- ' </div>\n' +
- '</div>';
- };
- JSY.delObjectKey=function (keyArray) {
- $.each(keyArray,function (key) {
- delete keyArray[key];
- });
- }
- /**
- * 获取指定的文件部分内容
- */
- JSY.getFileContent=function(file, chunkSize, start, cb) {
- var start = start;
- var bufferSize = file.size;
- var index = start / chunkSize;
- console.log('正在读取下一个块的文件内容 index:' + index);
- if (start + chunkSize > bufferSize) {
- chunkSize = bufferSize - start;
- }
- console.log('分块大小:', chunkSize);
- if(file.slice) {
- var blob = file.slice(start, start + Ks3.config.chunkSize);
- }else if(file.webkitSlice) {
- var blob = file.webkitSlice(start, start + Ks3.config.chunkSize);
- }else if(file.mozSlice) {
- var blob = file.mozSlice(start, start + Ks3.config.chunkSize);
- }else{
- throw new Error("blob API doesn't work!");
- }
- var reader = new FileReader();
- reader.onload = function(e) {
- cb(e.target.result);
- };
- reader.readAsArrayBuffer(blob);
- }
- JSY.getProgressKey=function(name, lastModified, bucket, key) {
- return name + "-" + lastModified + "-" + bucket + "-" + key;
- }
- JSY.configInit=function (file, progressKey,successFn) {
- var fileSize = file.size;
- var count = parseInt(fileSize / Ks3.config.chunkSize) + ((fileSize % Ks3.config.chunkSize == 0 ? 0: 1));
- if (count == 0){
- successFn && successFn({msg: 'The file is empty.'})
- }else {
- config = {
- name: file.name,
- size: fileSize,
- chunkSize: Ks3.config.chunkSize,
- count:count,
- index: 1,
- etags:{},
- retries: 0
- }
- localStorage.setItem(progressKey, JSON.stringify(config));
- successFn && successFn();
- }
- }
- //分片上传
- JSY.multipartUpload=function (opt) {
- var file = opt.File,key=opt.key || '',totalSize = file.size,that=this,changeVal=opt.changeVal || null,
- successFn=opt.success || null,errorFn=opt.error || null,contentType = opt.ContentType || '';
- var progressKey =this.getProgressKey(file.name, file.lastModified,Ks3.config.bucket, key);
- async.auto({
- /**
- * 初始化配置文件,如果没有就新建一个
- */
- init: function(callback) {
- //重置暂停标识
- Ks3.config.stopFlag = false;
- if ( !localStorage[progressKey]) {
- that.configInit(file, progressKey, function(err) {
- callback(err);
- })
- } else {
- callback(null);
- }
- },
- show: ['init', function(callback) {
- console.log(' 开始上传文件: ' + progressKey);
- config = JSON.parse(localStorage.getItem(progressKey));
- changeVal && changeVal(config);
- callback(null);
- }],
- /**
- * 获取uploadId,如果有就直接读取,没有就从服务器获取一个
- */
- getUploadId: ['init', function(callback) {
- config = JSON.parse(localStorage.getItem(progressKey));
- var uploadId = config['uploadId'];
- if ( !! uploadId) {
- callback(null, uploadId);
- } else {
- Ks3.multitpart_upload_init(opt, function(err, uploadId) {
- if(err) {
- callback(err);
- }else {
- config['uploadId'] = uploadId;
- localStorage.setItem(progressKey, JSON.stringify(config));
- callback(null, uploadId);
- }
- });
- }
- }],
- /**
- * 对文件进行上传
- * 上传后要把信息写到本地存储配置文件中
- * 如果都上传完了,就把相关本地存储信息删除
- * 并通知服务器,合并分块文件
- */
- upload: ['getUploadId', function(callback, result) {
- if(result.getUploadId) {
- var uploadId = result.getUploadId;
- Ks3.config.currentUploadId = uploadId;
- config = JSON.parse(localStorage.getItem(progressKey));
- var count = config['count'];
- var index = config['index'];
- var chunkSize = config['chunkSize'];
- var currentRetries = config['retries'];
- up();
- }else {
- callback({'msg':'no uploadId'});
- }
- // 在报错的时候重试
- function retry(err) {
- console.log('upload ERROR:', err);
- if (currentRetries > Ks3.config.retries) {
- errorFn && errorFn(err);
- } else {
- currentRetries = currentRetries + 1;
- config['retries'] = currentRetries;
- localStorage.setItem(progressKey, JSON.stringify(config));
- console.log('第 ' + currentRetries + ' 次重试');
- up();
- }
- }
- // 真正往服务端传递数据
- function up() {
- console.log('正在上传 ', 'index: ' + index);
- var start = (index - 1) * chunkSize;
- // 判断是否已经全部都传完了
- if (index <= count) {
- that.getFileContent(file, chunkSize, start, function(body) {
- delete opt.File;
- opt.UploadId = uploadId;
- opt.PartNumber = index;
- opt.body = body;
- opt.type = contentType;
- console.log('正在上传第 ', index, ' 块,总共: ', + count + ' 块');
- try {
- Ks3.upload_part(opt, function(err, partNumber, etag) {
- if (err) {
- if(err.status == 413 || err.status == 415) {
- callback(err);
- }else {
- retry(err);
- }
- } else {
- if(!Ks3.config.stopFlag) {
- config['index'] = index;
- changeVal && changeVal(config);
- config['etags'][index] = etag;
- localStorage.setItem(progressKey, JSON.stringify(config));
- index = index + 1;
- up();
- }else {
- callback({
- msg: "stop"
- });
- }
- }
- });
- } catch(e) {
- retry(e);
- }
- })
- } else {
- console.log('发送合并请求');
- delete opt.File;
- opt.UploadId = uploadId;
- opt.body = that.generateCompleteXML(progressKey);
- Ks3.upload_complete(opt, function(err, res) {
- if (err) throw err;
- callback(err, res);
- })
- }
- };
- }]
- },function(err, results) {
- if (!err) localStorage.removeItem(progressKey);
- if(err) errorFn && errorFn(err);
- else successFn && successFn(results);
- });
- }
- /**
- * 生成合并分块上传使用的xml
- */
- JSY.generateCompleteXML=function(progressKey) {
- var content = JSON.parse(localStorage.getItem(progressKey));
- var index = content.index;
- var str = '';
- if (index > 0) {
- str = '<CompleteMultipartUpload>';
- for (var i = 1; i <= index; i++) {
- str += '<Part><PartNumber>' + i + '</PartNumber><ETag>' + content.etags[i] + '</ETag></Part>'
- }
- str += '</CompleteMultipartUpload>';
- }
- return str;
- }
- //暂停
- JSY.suspendMultipartUpload=function () {
- Ks3.config.stopFlag = true;
- }
- //清除localStorage
- JSY.emptyLocalStorage=function(){
- var len = localStorage.length;
- for(var i=0; i< len; i++) {
- var itemKey = localStorage.key(i);
- //自动创建一个临时String对象封装itemKey在IE下会导致内存泄露,故显示转换
- if(typeof itemKey === 'string' && (new String(itemKey)).endWith(Ks3.config.bucket + '-' + Ks3.encodeKey(this.fileToBeUpload))) {
- localStorage.removeItem(itemKey);
- }
- }
- }
- //取消上传
- JSY.cancelMultipartUpload=function (findFn) {
- var that=this;
- //前端暂停
- Ks3.config.stopFlag = true;
- //通知ks3取消上传
- if(Ks3.config.currentUploadId) {
- Ks3.abort_multipart_upload({
- Bucket:Ks3.config.bucket,
- Key:this.fileToBeUpload,
- UploadId: Ks3.config.currentUploadId
- },function(err,res) {
- if(err) {
- findFn && findFn(err);
- }else{
- findFn && findFn(err);
- that.emptyLocalStorage();
- }
- });
- }
- }
- return win.JSY=JSY;
- })(window)
|