亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

vue webuploader 文件上傳組件開發

2019-11-19 15:19:22
字體:
來源:轉載
供稿:網友

最近項目中需要用到百度的webuploader大文件的分片上傳,對接后端的fastdfs,于是著手寫了這個文件上傳的小插件,步驟很簡單,但是其中猜到的坑也不少,詳細如下:

一、封裝組件

引入百度提供的webuploader.js、Uploader.swf

css樣式就直接寫在組件里面了 

<template> <div>  <div id="list" class="uploader-list"></div>  <div id="wrapper">   <div class="uploader-container">    <div :id="id" limitSize="1" :ext="ext"></div>    <el-button style="margin-bottom:10px;float:left;" size="small" :loading="uploadLoading" type="success" @click="start">上傳到服務器</el-button>    <el-button style="margin-left: 20px;margin-bottom:10px;float:left;" :disabled="stopBtn" size="small" type="danger" @click="stop">暫停上傳</el-button>   </div>  </div>  <div class="el-upload__tip">{{tip}}</div>  <div class="file-list">   <ul class="el-upload-list el-upload-list--text">    <li v-for="file in fileList" :class="['el-upload-list__item', 'is-' + file.status]" :key="file">     <a class="el-upload-list__item-name">      <i class="el-icon-document"></i>{{file.name}}     </a>     <label class="el-upload-list__item-status-label">      <i :class="{'el-icon-upload-success': true,'el-icon-circle-check': listType === 'text',     'el-icon-check': ['picture-card', 'picture'].indexOf(listType) > -1}"></i>     </label>     <i class="el-icon-close" @click="removeFile(file)"></i>     <el-progress      v-if="file.status === 'uploading'"      :type="listType === 'picture-card' ? 'circle' : 'line'"      :stroke-width="listType === 'picture-card' ? 6 : 2"      :percentage="file.percentage">     </el-progress>    </li>   </ul>  </div> </div></template><script> import '../js/jquery.js' import '../js/webuploader.js' import { Base64 } from 'js-base64' import CryptoJS from 'crypto-js'; export default{  name: 'fileUpload',  props: {   id: {    type: String,    default: function(){     return "filePicker";    }   },   //上傳提示   tip: {    type: String,    default: function(){     return "";    }   },   //文件后綴名限制   ext: {    type: String,    default: function(){     return "jpg,jpeg,png,pdf,mp4,avi.mp3";    }   },   //分片大小設置   chunkSize: {    type: Number,    default: function(){     return 2097152;    }   },   //分片上傳重試次數   chunkRetry: {    type: Number,    default: function(){     return 1;    }   },   //是否自動上傳   auto: {    type: Boolean,    default: function(){     return false;    }   },   //上傳文件大小限制   sizeLimit: {    type: Number,    default: function(){     return 209715200;    }   },   //上傳文件數量限制   countLimit: {    type: Number,    default: function(){     return 5;    }   }  },  data(){   return{    appId: AppConfig.appId,    securityKey: AppConfig.securityKey,    checkUrl: AppConfig.checkUrl,    uploadUrl: AppConfig.uploadUrl,    mergeUrl: AppConfig.mergeUrl,    previewName: '選擇文件',    wul_fileMd5: '',    wul_size: 0,    wul_fileName: '',    wul_chunk: 0,    wul_uploader: '',    fileList: [],    listType: 'text',    percentage: 0,    fileObject: {     uid: '',     name: '',     ext: '',     type: '',     status: '',     percentage: 0,     url: ''    },    uploadLoading: false,    stopBtn: true   }  },  methods: {   /**    * 獲取當前上傳列表中的文件    * @returns {Array|*}    */   getFileList: function(){    return this.fileList;   },   //綁定事件   wul_init: function() {    //提示只能選擇一個文件    this.wul_uploader.on('filesQueued', function (files) {     if (files.length > 1) {      this.$message({       message: '請選擇一張圖片',       type: 'error'      });      for (var i = 0; i < files.length; i++) {       this.wul_uploader.cancelFile(files[i]);      }      this.wul_uploader.reset();      this.wul_fileMd5 = "";      this.wul_size = 0;      this.wul_fileName = "";      this.wul_chunk = 0;  //當前切片數     }else{      if( this.fileList.length == this.countLimit ){       this.$message({        message: '已經達到上傳文件限制數量',        type: 'error'       });      }else{       //此時往需要上傳的文件列表中添加文件       let file = {        uid: Date.now() + this.tempIndex++,        name: files[0].name,        type: files[0].type,        ext: files[0].ext,        status: "ready",        percentage: 0       }       this.fileObject = file;       this.fileList.push(this.fileObject);      }     }    }.bind(this));    //文件校驗格式和大小    this.wul_uploader.on('error', function (type) {      debugger     if (type == 'Q_EXCEED_SIZE_LIMIT') {      this.$message({       message: '文件超過指定大小',       type: 'error'      });     }     if (type == 'Q_TYPE_DENIED') {      this.$message({       message: '文件格式錯誤,請選擇文件',       type: 'error'      });     }     if (type == 'F_EXCEED_SIZE') {      this.$message({       message: "文件超過" + this.sizeLimit / 1024 / 1024 + "M",       type: 'error'      });     }    }.bind(this));    //上傳進度    this.wul_uploader.on('uploadProgress', function (file, percentage) {     this.percentage = percentage * 100;     this.fileObject.status = "uploading";     this.fileObject.percentage = this.percentage;     console.log(this.fileObject.percentage);    }.bind(this));    //每次切片上傳完成之后的判斷    this.wul_uploader.on('uploadAccept', function (object, ret) {     if (ret.responseCode != 0) {      this.wul_uploader.cancelFile(this.wul_uploader.getFiles()[0].id);     }    });    this.wul_uploader.on('uploadBeforeSend', function(object, data, headers) {     console.log(data);    });   },   option: function(key, val) {    this.wul_uploader.option(key, val);    var options = this.wul_uploader.options;    this.wul_uploader.destroy();  //注銷uploader    this.wul_uploader = WebUploader.create(options);    this.wul_init();   },   start: function(){    if(this.wul_uploader.getFiles()[0] != null) {     this.wul_uploader.upload(this.wul_uploader.getFiles()[0].id);     this.uploadLoading = true;     this.stopBtn = false;    } else {     this.$message({      message: "請選擇上傳文件",      type: 'error'     });    }   },   stop: function(){    this.wul_uploader.cancelFile(this.wul_uploader.getFiles()[0].id);   },   removeFile: function(file){    this.fileList.splice(this.fileList.indexOf(file), 1);   },   change: function(){    this.option('accept', {     title: 'Images',     extensions: 'gif,jpg,jpeg,bmp,png'    });   }  },  mounted(){   WebUploader.Uploader.register({    "before-send-file": "beforeSendFile",    "before-send": "beforeSend",    "after-send-file": "afterSendFile",   }, {    beforeSendFile: function (file) {     var deferred = WebUploader.Deferred();     this.wul_uploader.md5File(file).then(function (val) {      this.wul_fileMd5 = val;      this.wul_size = file.size;      this.wul_fileName = file.name;      var timestamp = Date.parse(new Date()) / 1000;      var signParam = "{chunkSize=" + this.chunkSize + ", fileMd5=" + this.wul_fileMd5 + ", size=" + this.wul_size + ", timestamp=" + timestamp + "}";      var sign = Base64.encode(CryptoJS.HmacSHA1(signParam, this.securityKey));      // 獲取斷點續傳位置      jQuery.ajax({       type: "POST",       // 測試       url: this.checkUrl,       data: {        // 文件大小        size: this.wul_size,        // 文件唯一標記        fileMd5: this.wul_fileMd5,        // 切片大小        chunkSize: this.chunkSize,        // 簽名        sign: sign,        // 應用分配id        appId: this.appId,        // 當前時間戳        timestamp: timestamp       },       dataType: "json",       // 上傳失敗       error: function (XMLHttpRequest, textStatus, errorThrown) {        this.$message({         message: "上傳失敗...",         type: 'error'        });        this.uploadLoading = false;        this.stopBtn = true;       }.bind(this),       success: function (response) {        if (response.responseCode == 0) { // 切片獲取成功         this.wul_chunk = response.chunk;         deferred.resolve();        } else { // 切片獲取失敗,請求成功         this.wul_uploader.cancelFile(file);  //取消文件上傳         this.$message({          message: "切片檢查失敗,請聯系管理員",          type: 'error'         });         deferred.resolve();         this.uploadLoading = false;         this.stopBtn = true;        }       }.bind(this)      });      return deferred.promise();     }.bind(this));     return deferred.promise();    }.bind(this),    beforeSend: function (block) {     var deferred = WebUploader.Deferred();     if (block.chunk < this.wul_chunk) {      return deferred.reject();     }     this.wul_uploader.md5File(block.blob).then(function (chunkMd5) {      var timestamp = Date.parse(new Date()) / 1000;      var signParam = '{chunk=' + block.chunk + ', chunkMd5=' + chunkMd5 + ', chunkSize=' + this.chunkSize + ', fileMd5=' + this.wul_fileMd5 + ', size=' + this.wul_size + ', timestamp=' + timestamp + '}';      var signTemp = CryptoJS.HmacSHA1(signParam, this.securityKey);      var sign = Base64.encode(signTemp);  //獲取sign值      this.wul_uploader.options.formData = {       'timestamp': timestamp,       'appId': this.appId,       'chunk': block.chunk,       'chunkSize': this.chunkSize,       'fileMd5': this.wul_fileMd5,       'chunkMd5': chunkMd5,       'size': this.wul_size,       'sign': sign      };      deferred.resolve();     }.bind(this))     return deferred.promise();    }.bind(this),    afterSendFile: function (file) {     var timestamp = Date.parse(new Date()) / 1000;     var signParam = "{chunkSize=" + this.chunkSize + ", fileMd5=" + this.wul_fileMd5 + ", fileName=" + file.name + ", size=" + this.wul_size + ", timestamp=" + timestamp + "}";     var sign = Base64.encode(CryptoJS.HmacSHA1(signParam, this.securityKey));     // 如果分塊上傳成功,則通知后臺合并分塊     jQuery.ajax({      type: "POST",      url: this.mergeUrl,      data: {       appId: this.appId,       fileMd5: this.wul_fileMd5,       fileName: file.name,       chunkSize: this.chunkSize,       sign: sign,       size: this.wul_size,       timestamp: timestamp      },      success: function (response) {       if (response.responseCode == 0) {        this.fileObject.status = "success";        this.fileObject.percentage = 100;        this.fileObject.url = response.filePath;       } else {        this.fileObject.status = "exception";        this.$message({         message: "上傳失敗,失敗原因:" + response.responseMsg,         type: 'error'        });       }       this.uploadLoading = false;       this.stopBtn = true;       this.wul_uploader.reset();       this.wul_fileMd5 = "";       this.wul_size = 0;       this.wul_fileName = "";       this.wul_chunk = 0;  //當前切片數      }.bind(this)     });    }.bind(this)   });   this.wul_uploader = WebUploader.create({    // swf文件路徑    swf: '../js/Uploader.swf',    // 文件接收服務端。    server: this.uploadUrl,    // 定義選擇按鈕    pick: {     "id": "#" + this.id,     "innerHTML": this.previewName    },    // 自動上傳    auto: this.auto,    // 禁止瀏覽器打開文件    disableGlobalDnd: true,    // 添加截圖功能    paste: '#wrapper',    // 定義拖動面板    dnd: '#wrapper',    // 分片上傳    chunked: true,    // 分片大小為2M    chunkSize: this.chunkSize,    // 分片上傳失敗重試次數    chunkRetry: this.chunkRetry,    // 圖片不做壓縮    compress: false,    // 隊列設置10個,為了選擇多個文件的時候能提示    fileNumLimit: 10,    // 提前準備好下一個文件    prepareNextFile: true,    // 限制單個文件大小    fileSingleSizeLimit: this.sizeLimit,    //線程數    threads : 1,    // 限制格式    accept: {     title: "access",     extensions: this.ext    }   });   this.wul_init();  } }</script><style> /* ----------------Reset Css--------------------- */ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary, time, mark, audio, video, input {  margin: 0;  padding: 0;  border: none;  outline: 0;  font-size: 100%;  font: inherit;  vertical-align: baseline; } html, body, form, fieldset, p, div, h1, h2, h3, h4, h5, h6 {  -webkit-text-size-adjust: none; } article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {  display: block; } body {  font-family: arial, sans-serif; } ol, ul {  list-style: none; } blockquote, q {  quotes: none; } blockquote:before, blockquote:after, q:before, q:after {  content: '';  content: none; } ins {  text-decoration: none; } del {  text-decoration: line-through; } table {  border-collapse: collapse;  border-spacing: 0; } /* ------------ */ #wrapper {  width: 100%;  margin: 0 auto;  height: 35px; } .img-preview {  width: 160px;  height: 90px;  margin-top: 1em;  border: 1px solid #ccc; } .cropper-wraper {  position: relative; } .upload-btn {  background: #ffffff;  border: 1px solid #cfcfcf;  color: #565656;  padding: 10px 18px;  display: inline-block;  border-radius: 3px;  margin-left: 10px;  cursor: pointer;  font-size: 14px;  position: absolute;  right: 1em;  bottom: 2em; } .upload-btn:hover {  background: #f0f0f0; } .uploader-container{  width: 100%;  font-size: 10px; } .webuploader-container {  position: relative;  width: 100px;  height: 21px;  float: left; } .webuploader-element-invisible {  position: absolute !important;  clip: rect(1px 1px 1px 1px); /* IE6, IE7 */  clip: rect(1px,1px,1px,1px); } .webuploader-pick {  position: relative;  display: inline-block;  cursor: pointer;  background: #00b7ee;  padding: 6px 15px;  color: #fff;  text-align: center;  border-radius: 3px;  overflow: hidden; } .webuploader-pick-hover {  background: #00a2d4; } .webuploader-pick-disable {  opacity: 0.6;  pointer-events:none; } .file-list{  width: 100%; }</style> 

二、導出組件

var fileUpload = require('./src/file_upload.vue');module.exports = { fileUpload} 

三、demo  引用方式

<template> <div>  <el-card class="box-card">   <fileUpload ref="fileUpload" :ext="ext" :countLimit="5" :tip="tip">aaa</fileUpload>  </el-card> </div></template><script> import {fileUpload} from '@/components/fileUpload/index.js' export default{  name: 'hello',  components: {fileUpload},  data(){   return{    fileList: [],    ext: 'png,jpg,jpeg,mp3,mp4,pdf',    tip: '可上傳png/jpg/jpeg/mp3/mp4/pdf,大小不超過200M'   }  },  created(){  },  methods: {   getFileList: function(){    this.fileList = this.$refs.fileUpload.getFileList();    console.log(this.fileList);   }  } }</script> 

四、運行效果圖

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97色在线观看| 色综合天天综合网国产成人网| 中文字幕欧美精品日韩中文字幕| 欧美精品www在线观看| 欧美性猛交99久久久久99按摩| 国产一区二区三区直播精品电影| 国产精品欧美风情| 亚洲精品www久久久久久广东| 日韩经典一区二区三区| 亚洲成年网站在线观看| 亚洲男子天堂网| 成人性教育视频在线观看| 国产一区视频在线播放| 久久久女人电视剧免费播放下载| 亚洲最大福利网| 亚洲男人天天操| 日韩电影在线观看永久视频免费网站| 欧日韩不卡在线视频| 国产精品美乳在线观看| 久久综合亚洲社区| 久久久久久久久久久免费| 欧美精品一区二区免费| 日韩中文第一页| 久久色在线播放| 欧美久久精品午夜青青大伊人| 亚洲一区二区三区视频播放| 日本一区二区在线播放| 91综合免费在线| 亚洲欧洲国产精品| 欧美极品在线视频| 国产主播精品在线| 亚洲欧美日韩国产中文专区| 91欧美精品成人综合在线观看| 成人性生交大片免费观看嘿嘿视频| 日韩精品视频免费专区在线播放| 欧美黑人极品猛少妇色xxxxx| 欧美成人免费va影院高清| 国产午夜精品美女视频明星a级| 精品久久久av| 久久久久久综合网天天| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产成人精品一区二区三区| 日韩欧美在线中文字幕| 日韩中文视频免费在线观看| 综合网日日天干夜夜久久| 亚洲欧美在线看| 欧美肥臀大乳一区二区免费视频| 日韩av不卡电影| 欧美精品激情在线观看| 国产欧洲精品视频| 亚洲国产精品yw在线观看| 国产精品久久久久久久久久久不卡| 狠狠色狠狠色综合日日五| 91精品国产成人www| 国产成人小视频在线观看| 日韩在线精品视频| 91美女片黄在线观| 久久久这里只有精品视频| 国产精品激情av在线播放| 乱亲女秽乱长久久久| 国产日韩欧美综合| 成人欧美一区二区三区在线湿哒哒| 欧美电影在线播放| 91精品国产高清自在线看超| 国产日韩欧美日韩大片| 精品国产乱码久久久久酒店| 黄色一区二区在线| 国产一区二区三区免费视频| 国产精品美女网站| 中日韩美女免费视频网站在线观看| 久久精品视频导航| 91九色蝌蚪国产| 66m—66摸成人免费视频| 日韩在线高清视频| 日韩欧美一区视频| 91精品视频免费观看| 欧美激情啊啊啊| 国产精品扒开腿做爽爽爽视频| 不卡在线观看电视剧完整版| 日韩在线精品视频| 欧美大片免费看| 亚洲免费成人av电影| 91视频九色网站| 欧美日韩在线视频首页| www.日韩不卡电影av| 91av中文字幕| 欧美日韩国产激情| 久久成人精品一区二区三区| 亚洲欧美日本精品| 日韩有码在线播放| 97久久超碰福利国产精品…| 国产精品久久久久久久久影视| 国产亚洲欧美日韩一区二区| 国产三级精品网站| 久久久这里只有精品视频| 清纯唯美亚洲综合| 国产一区欧美二区三区| 亚洲影院高清在线| 亚洲欧美在线看| 成人久久久久久| 亚洲人成在线观看| 日韩有码片在线观看| 欧美极品欧美精品欧美视频| 亚洲一区二区久久| 日韩精品在线视频| 欧美专区国产专区| 国产在线观看精品一区二区三区| 成人国产精品久久久久久亚洲| 精品久久久久久久久久| 国产日产欧美精品| 国产三级精品网站| 夜夜嗨av一区二区三区免费区| 亚洲国产精品一区二区三区| 久久综合伊人77777蜜臀| 91精品国产高清| 欧美性精品220| 日韩av免费观影| 精品一区二区电影| 亚洲系列中文字幕| 国产精品美腿一区在线看| 亚洲天堂av电影| 成人做爽爽免费视频| 国产精品久久久久久久天堂| 日韩高清电影免费观看完整版| 欧美激情第99页| 国产午夜精品视频| 日韩精品欧美国产精品忘忧草| 国内精品久久久久久中文字幕| 日韩av高清不卡| 中文字幕精品—区二区| 日韩av中文在线| 亚洲欧美精品在线| 美女啪啪无遮挡免费久久网站| 美女福利视频一区| 不用播放器成人网| 国产精品精品视频| 欧美激情按摩在线| 国产欧美精品xxxx另类| 欧美色图在线视频| 亚洲国产成人91精品| 欧美美女15p| 亚洲人成电影网站色…| 成人444kkkk在线观看| 91成人福利在线| 岛国精品视频在线播放| 成人国产精品av| 国产精品夜间视频香蕉| 中文字幕欧美日韩| 国模叶桐国产精品一区| 日韩av网站大全| 日韩av网站大全| 欧美性开放视频| 97福利一区二区| 亚洲国产欧美一区二区三区同亚洲| 欧美国产日韩xxxxx| 亚洲一区二区中文| 亚洲欧美一区二区三区在线| 精品偷拍各种wc美女嘘嘘| 欧美久久精品午夜青青大伊人| 国产中文日韩欧美| 中文字幕日本精品| 欧美猛男性生活免费| 综合激情国产一区| 不卡在线观看电视剧完整版|