6 changed files with 478 additions and 11 deletions
			
			
		- 
					8.env.development
- 
					6src/api/material/material.js
- 
					105src/views/components/upload_img.vue
- 
					161src/views/components/upload_img2.vue
- 
					187src/views/components/upload_img3.vue
- 
					22src/views/materialContent/materialList/index.vue
| @ -0,0 +1,105 @@ | |||
| <template> | |||
|   <!-- upload --> | |||
|   <div class="upload"> | |||
|     <el-upload | |||
|       class="avatar-uploader" | |||
|       :action="domain" | |||
|       :http-request="upqiniu" | |||
|       :show-file-list="false" | |||
|       :before-upload="beforeUpload" | |||
|     > | |||
|       <img v-if="imageUrl" :src="imageUrl" class="avatar" /> | |||
|       <i v-else class="el-icon-plus avatar-uploader-icon"></i> | |||
|     </el-upload> | |||
|   </div> | |||
| </template> | |||
| <script> | |||
| import axios from 'axios' | |||
| import { getQiniuToken } from '@/api/material/material' | |||
| export default { | |||
|   data() { | |||
|     return { | |||
|       imageUrl: '', | |||
|       token: {}, | |||
|       // 七牛云的上传地址,根据自己所在地区选择,我这里是华南区 | |||
|       domain: 'https://upload.qiniup.com/', | |||
|       // 这是七牛云空间的外链默认域名 | |||
|       qiniuaddr: 'qiniu.aiyxlib.com' | |||
|     } | |||
|   }, | |||
|   methods: { | |||
|     // 上传文件到七牛云 | |||
|     upqiniu(req) { | |||
|       console.log(req) | |||
|       const config = { | |||
|         headers: { 'Content-Type': 'multipart/form-data' } | |||
|       } | |||
|       let filetype = '' | |||
|       if (req.file.type === 'image/png') { | |||
|         filetype = 'png' | |||
|       } else { | |||
|         filetype = 'jpg' | |||
|       } | |||
|       // 重命名要上传的文件 | |||
|       const keyname = 'material' + Math.random() * 100 + '.' + filetype | |||
|       // 从后端获取上传凭证token | |||
|       getQiniuToken().then(res => { | |||
|         console.log(res) | |||
|         const formdata = new FormData() | |||
|         formdata.append('file', req.file) | |||
|         formdata.append('token', res.data) | |||
|         formdata.append('key', keyname) | |||
|         // 获取到凭证之后再将文件上传到七牛云空间 | |||
|         axios.post(this.domain, formdata, config).then(res => { | |||
|           this.imageUrl = 'http://' + this.qiniuaddr + '/' + res.data.key | |||
|           console.log(this.imageUrl) | |||
|         }) | |||
|       }) | |||
|       // this.axios.get('/up/token').then(res => { | |||
| 
 | |||
|       // }) | |||
|     }, | |||
|     // 验证文件合法性 | |||
|     beforeUpload(file) { | |||
|       const isJPG = file.type === 'image/jpeg' || file.type === 'image/png' | |||
|       const isLt2M = file.size / 1024 / 1024 < 10 | |||
|       if (!isJPG) { | |||
|         this.$message.error('上传头像图片只能是 JPG 格式!') | |||
|       } | |||
|       if (!isLt2M) { | |||
|         this.$message.error('上传头像图片大小不能超过 10MB!') | |||
|       } | |||
|       return isJPG && isLt2M | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| <style scoped> | |||
| .upload { | |||
|   width: 600px; | |||
|   margin: 0 auto; | |||
| } | |||
| .avatar-uploader .el-upload { | |||
|   border: 5px dashed #ca1717 !important; | |||
|   border-radius: 6px; | |||
|   cursor: pointer; | |||
|   position: relative; | |||
|   overflow: hidden; | |||
| } | |||
| .avatar-uploader .el-upload:hover { | |||
|   border-color: #409EFF; | |||
| } | |||
| .avatar-uploader-icon { | |||
|   font-size: 28px; | |||
|   color: #8c939d; | |||
|   width: 178px; | |||
|   height: 178px; | |||
|   line-height: 178px; | |||
|   text-align: center; | |||
| } | |||
| .avatar { | |||
|   width: 178px; | |||
|   height: 178px; | |||
|   display: block; | |||
| } | |||
| </style> | |||
| @ -0,0 +1,161 @@ | |||
| <template> | |||
|   <div id="mef-m-authentication-apply"> | |||
|     <div class="apply-upload-item fr noMb"> | |||
|       <div class="photo-upload item-03" :class="{uploaded: userWorkPhoto}" @click="photoUpload('userWorkPhoto')"> | |||
|         <img :src="userWorkPhoto" onerror="this.src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII='" class="fit-cover-img" /> | |||
|         <span v-if="userWorkPhoto" class="delete-icon" @click.stop="clearPhotoUrl('userWorkPhoto')"></span> | |||
|       </div> | |||
|     </div> | |||
|   </div> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| /* function getQiniuToken() { | |||
|   return Promise.resolve({'uptoken': 'xxx'}); | |||
| } */ | |||
| 
 | |||
| // c39eAF6CRLXTPcOp7YZWN47QG-R8GMdJwBtBQ1Eb:vQEKW6kSJvaMFOD6G0Fj1toohjE=:eyJzY29wZSI6ImFpeXVleGluZzoiLCJkZWFkbGluZSI6MTY0NzU3NjY4N30= | |||
| 
 | |||
| /* c39eAF6CRLXTPcOp7YZWN47QG-R8GMdJwBtBQ1Eb:MZKUih1U9m0jKz57RwADJw02a9U=:eyJwZXJzaXN0ZW50UGlwZWxpbmUiOiJhaXl4bGliX3ZpZGVvLXBpcGUiLCJzY29wZSI6ImFpeXVleGluZyIsInBlcnNpc3RlbnRPcHMiOiJhdnRodW1iL20zdTgvbm9Eb21haW4vMS9zZWd0aW1lLzE1L3ZiLzQ0MGsvaGxzS2V5L2Z0em4xOWFpeXhsaWIyMDEvaGxzS2V5VXJsL2h0dHBzOi8vcWluaXUuYWl5eGxpYi5jb20vYWl4eWxpYndvcmQua2V5fHNhdmVhcy8iLCJkZWFkbGluZSI6MTY0NzU3NjcxOX0=*/ | |||
| import { getQiniuToken } from '@/api/material/material' | |||
| export default { | |||
|   name: 'Upload', | |||
|   data() { | |||
|     return { | |||
|       userWorkPhoto: '' | |||
|     } | |||
|   }, | |||
|   mounted() { | |||
| 
 | |||
|   }, | |||
|   methods: { | |||
|     clearPhotoUrl(urlName) { | |||
|       this[urlName] = '' | |||
|     }, | |||
|     photoUpload(type) { | |||
|       const ipt = document.createElement('input') | |||
|       ipt.setAttribute('type', 'file') | |||
|       ipt.setAttribute('accept', 'image/*') | |||
|       ipt.style.width = 0 | |||
|       ipt.style.height = 0 | |||
|       ipt.addEventListener('change', async() => { | |||
|         const [file] = ipt.files | |||
|         const base64Img = await this.fileToBase64(file) | |||
|         const url = await this.uploadBase64(base64Img) | |||
|         this.userWorkPhoto = url | |||
|         document.body.removeChild(ipt) | |||
|       }) | |||
|       document.body.appendChild(ipt) | |||
|       ipt.click() | |||
|     }, | |||
|     uploadBase64(base64Img) { | |||
|       return new Promise((resolve) => { | |||
|         getQiniuToken() | |||
|           .then(res => { | |||
|             const key = 'qiniu.aiyxlib.com' + this.uuid() + '.jpg' | |||
|             const pic = base64Img.split(',')[1] | |||
|             // const url = 'https://upload.qiniup.com/' + window.btoa(key) // 非华东空间需要根据注意事项 1 修改上传域名 | |||
|             const url = 'https://upload.qiniup.com/' // 非华东空间需要根据注意事项 1 修改上传域名 | |||
|             const xhr = new XMLHttpRequest() | |||
|             xhr.onreadystatechange = () => { | |||
|               if (xhr.readyState == 4) { | |||
|                 resolve( | |||
|                   'qiniu.aiyxlib.com' + JSON.parse(xhr.responseText).key | |||
|                 ) | |||
|               } | |||
|             } | |||
|             xhr.open('POST', url, true) | |||
|             xhr.setRequestHeader('Content-Type', 'application/octet-stream') | |||
|             xhr.setRequestHeader('Authorization', 'UpToken ' + res.data) | |||
|             xhr.send(pic) | |||
|             // 获取到凭证之后再将文件上传到七牛云空间 | |||
|           }) | |||
|           .catch(console.error) | |||
|       }) | |||
|     }, | |||
|     fileToBase64(file) { | |||
|       return new Promise((resolve) => { | |||
|         const reader = new FileReader() | |||
|         // 传入一个参数对象即可得到基于该参数对象的文本内容 | |||
|         reader.readAsDataURL(file) | |||
|         reader.onload = function(e) { | |||
|           // target.result 该属性表示目标对象的DataURL | |||
|           resolve(e.target.result) | |||
|         } | |||
|       }) | |||
|     }, | |||
|     uuid(len, radix) { | |||
|       const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('') | |||
|       const uuid = [] | |||
|       let i | |||
|       radix = radix || chars.length | |||
|       if (len) { | |||
|         for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix] | |||
|       } else { | |||
|         let r | |||
|         uuid[8] = uuid[13] = uuid[18] = uuid[23] = '' | |||
|         uuid[14] = '4' | |||
|         for (i = 0; i < 36; i++) { | |||
|           if (!uuid[i]) { | |||
|             r = 0 | Math.random() * 16 | |||
|             uuid[i] = chars[i == 19 ? r & 0x3 | 0x8 : r] | |||
|           } | |||
|         } | |||
|       } | |||
|       return uuid.join('') | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| <style lang="scss" scoped> | |||
|   #mef-m-authentication-apply{ | |||
|     .apply-upload-item{ | |||
|       width: 132px; | |||
|       margin-bottom: 30px; | |||
|       text-align: center; | |||
|       &.noMb{ | |||
|         margin-bottom: 0; | |||
|       } | |||
|       .photo-upload { | |||
|         width: 132px; | |||
|         height: 96px; | |||
|         position: relative; | |||
|         margin-bottom: 10px; | |||
|         &.item-03{ | |||
|           // background: top / 100% url(~@/assets/images/authentication/upload_workCard.png) | |||
|           // no-repeat; | |||
|         } | |||
|         &.uploaded{ | |||
|           background: none; | |||
|         } | |||
|         img{ | |||
|           width: 85px; | |||
|           height: 85px; | |||
|           position: absolute; | |||
|           left: 50%; | |||
|           top: 50%; | |||
|           transform: translate(-50%,-50%); | |||
|         } | |||
|         .delete-icon{ | |||
|           width: 16px; | |||
|           height: 16px; | |||
|           // background: top / 100% url(~@/assets/images/common/icon-del.png) | |||
|           //   no-repeat; | |||
|           border-radius: 0; | |||
|           top: -8px; | |||
|           right: -8px; | |||
|           position: absolute; | |||
|           i { | |||
|             display: none; | |||
|           } | |||
|         } | |||
|       } | |||
|       .apply-name{ | |||
|         font-size: 14px; | |||
|         font-weight: bold; | |||
|         padding-top: 10px; | |||
|         text-align: center; | |||
|       } | |||
|     } | |||
|   } | |||
| </style> | |||
| @ -0,0 +1,187 @@ | |||
| <template> | |||
|   <div class="upload"> | |||
|     <div id="video_container"> | |||
|       <div id="pickfiles">上传视频</div> | |||
|       <div> | |||
|         <div class="upload_info"> | |||
|           <b>共{{ fileSize }}MB | 已上传{{ fileLoaded }} | 上传速度{{ fileSpeed }}/s</b> | |||
|         </div> | |||
|         <div> | |||
|           <b>上传进度:{{ filePercent }}%</b> | |||
|         </div> | |||
|         <button @click="pauseUpload">暂停上传</button> | |||
|         <button @click="continueUpload">继续上传</button> | |||
|       </div> | |||
|     </div> | |||
|     <div v-if="coverPic" class="cover-pic"> | |||
|       <img :src="coverPic" alt="" /> | |||
|     </div> | |||
|   </div> | |||
| </template> | |||
| 
 | |||
| <script> | |||
| // import { apis, chttp } from '@/libs/interfaces' | |||
| import * as qiniu from 'qiniu-js' | |||
| export default { | |||
|   data() { | |||
|     return { | |||
|       fileSize: 0, | |||
|       fileLoaded: 0, | |||
|       fileSpeed: 0, | |||
|       filePercent: 0, | |||
|       uploader: null, | |||
|       token: '', | |||
|       filename: '', | |||
|       hash: '', | |||
|       resFileName: '', | |||
|       coverPic: '', | |||
|       phoneType: null | |||
|     } | |||
|   }, | |||
|   mounted() { | |||
|     this.phoneType = this.getPhoneType() | |||
|     this.getToken(() => { | |||
|       this.initUploader() | |||
|     }) | |||
|   }, | |||
|   methods: { | |||
|     pauseUpload() { | |||
|       this.uploader.stop() | |||
|     }, | |||
|     continueUpload() { | |||
|       this.uploader.start() | |||
|     }, | |||
|     toDecimal(size) { | |||
|       size = size / 1024 / 1024 | |||
|       var f = parseFloat(size) | |||
|       if (isNaN(f)) { | |||
|         return | |||
|       } | |||
|       f = Math.round(size * 10) / 10 | |||
|       var s = f.toString() | |||
|       var rs = s.indexOf('.') | |||
|       if (rs < 0) { | |||
|         rs = s.length | |||
|         s += '.' | |||
|       } | |||
|       while (s.length <= rs + 1) { | |||
|         s += '0' | |||
|       } | |||
|       return s | |||
|     }, | |||
|     initUploader() { | |||
|       const plupload = window.plupload | |||
|       const Qiniu = global.Qiniu | |||
|       const _this = this | |||
|       // domain为七牛空间对应的域名,选择某个空间后,可通过 空间设置->基本设置->域名设置 查看获取 | |||
|       const isIphone5 = this.phoneType === '5' | |||
|       // uploader为一个plupload对象,继承了所有plupload的方法 | |||
|       this.uploader = Qiniu.uploader({ | |||
|         runtimes: 'html5,flash,html4', // 上传模式,依次退化 | |||
|         browse_button: 'pickfiles', // 上传选择的点选按钮,必需 | |||
|         uptoken: this.token, // uptoken是上传凭证,由其他程序生成 | |||
|         get_new_uptoken: true, // 设置上传文件的时候是否每次都重新获取新的uptoken | |||
|         bucket_name: 'common-web', // 空间名 | |||
|         unique_names: false, // 默认false,key为文件名。若开启该选项,JS-SDK会为每个文件自动生成key(文件名) | |||
|         save_key: false, // 默认false。若在服务端生成uptoken的上传策略中指定了sava_key,则开启,SDK在前端将不对key进行任何处理 | |||
|         domain: 'https://upload.qiniup.com/', // bucket domain eg:http://qiniu-plupload.qiniudn.com/ | |||
|         container: 'video_container', // 上传区域DOM ID,默认是browser_button的父元素 | |||
|         max_file_size: '10mb', // 最大文件体积限制 | |||
|         dragdrop: false, // 开启可拖曳上传 | |||
|         drop_element: 'video_container', // 拖曳上传区域元素的ID,拖曳文件或文件夹后可触发上传 | |||
|         chunk_size: '4mb', // 分块上传时,每块的体积 | |||
|         max_retries: 3, // 上传失败最大重试次数 | |||
|         auto_start: true, // 选择文件后自动上传,若关闭需要自己绑定事件触发上传 | |||
|         multi_selection: !isIphone5, | |||
|         init: { | |||
|           Key: function(up, files) { | |||
|             return _this.filename | |||
|           }, | |||
|           FilesAdded: function(up, files) { | |||
|             plupload.each(files, function(file) { | |||
|               // 文件添加进队列后,处理相关的事情 | |||
|               console.log('FilesAdded') | |||
|               _this.fileSize = _this.toDecimal(file.size) | |||
|             }) | |||
|           }, | |||
|           BeforeUpload: function(up, file) { | |||
|             console.log('BeforeUpload') | |||
|           }, | |||
|           ChunkUploaded: function(up, file, info) { | |||
|             console.log('ChunkUploaded') | |||
|           }, | |||
|           UploadProgress: function(up, file) { | |||
|             // 每个文件上传时,处理相关的事情 | |||
|             _this.filePercent = parseInt(file.percent) | |||
|             _this.fileLoaded = plupload.formatSize(file.loaded).toUpperCase() | |||
|             _this.fileSpeed = plupload.formatSize(file.speed).toUpperCase() | |||
|           }, | |||
|           FileUploaded: function(up, file, info) { | |||
|             console.log('FileUploaded') | |||
|             const response = JSON.parse(info.response) | |||
|             _this.hash = response.hash | |||
|             _this.resFileName = response.key | |||
|             _this.coverPic = 'qiniu.aiyxlib.com' + response.key + '?vframe/png/offset/7/w/480' | |||
|           }, | |||
|           Error: function(up, err, errTip) { | |||
|             // 上传出错时,处理相关的事情 | |||
|             _this.$toast('Error =') | |||
|             _this.$toast(err) | |||
|             _this.$toast('errTip =') | |||
|             _this.$toast(errTip) | |||
|           }, | |||
|           UploadComplete: function() { | |||
|             // 队列文件处理完毕后,处理相关的事情 | |||
|             _this.$toast('UploadComplete') | |||
|           } | |||
|         } | |||
|       }) | |||
|     }, | |||
|     getToken(callback) { | |||
|       this.filename = 'webvideo/' + new Date().getTime() + '.mp4' | |||
|       const params = { | |||
|         filename: this.filename | |||
|       } | |||
|       chttp.get(apis.qiniuToken, { params: params }) | |||
|         .then(res => { | |||
|           this.token = res.token | |||
|           callback() | |||
|         }) | |||
|     }, | |||
|     getPhoneType() { | |||
|       // 正则,忽略大小写 | |||
|       var patternPhone = new RegExp('iphone', 'i') | |||
|       var patternAndroid = new RegExp('Android', 'i') | |||
|       var userAgent = navigator.userAgent.toLowerCase() | |||
|       var isAndroid = patternAndroid.test(userAgent) | |||
|       var isIphone = patternPhone.test(userAgent) | |||
|       var phoneType = 'phoneType' | |||
|       if (isAndroid) { | |||
|         var zhCnIndex = userAgent.indexOf('-') | |||
|         var spaceIndex = userAgent.indexOf('build', zhCnIndex + 4) | |||
|         var fullResult = userAgent.substring(zhCnIndex, spaceIndex) | |||
|         phoneType = fullResult.split('')[1] | |||
|       } else if (isIphone) { | |||
|         // 6   w=375    6plus w=414   5s w=320     5 w=320 | |||
|         var wigth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth | |||
|         if (wigth > 400) { | |||
|           phoneType = 'iphone6 plus' | |||
|         } else if (wigth > 370) { | |||
|           phoneType = 'iphone6' | |||
|         } else if (wigth > 315) { | |||
|           phoneType = '5' | |||
|         } else { | |||
|           phoneType = 'iphone 4s' | |||
|         } | |||
|       } else { | |||
|         phoneType = '您的设备太先进了' | |||
|       } | |||
|       return phoneType | |||
|     } | |||
|   } | |||
| } | |||
| </script> | |||
| 
 | |||
| <style lang="scss" scoped> | |||
| </style> | |||
| 
 | |||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue