我的项目在须要应用到大文件上传时,抉择通过前端直连阿里Oss,个人感觉是个不错的抉择。
一方面不须要本人搭建文件服务器,另一个能节约服务器的带宽压力。
在这记录一下,本人写的Oss图片上传组件
获取Token
虽说是前端直连,然而Token还是从后盾获取的。这个时候就须要后盾大哥搞个获取Oss的Token接口,接下来就能够欢快地上传图片啦。
import { getOssToken } from "@/util/common"; const OSS = require("ali-oss");let client;created() { getOssToken().then((res) => { client = new OSS({ // yourRegion填写Bucket所在地区。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。 region: "oss-cn-hangzhou", // 从STS服务获取的长期拜访凭证。长期拜访凭证包含长期拜访密钥(AccessKeyId和AccessKeySecret)和平安令牌(SecurityToken)。 accessKeyId: res.data.accessKeyId, accessKeySecret: res.data.accessKeySecret, stsToken: res.data.securityToken, // 填写Bucket名称。 bucket: "Bucket", }); });},
上传图片用到的还是咱们的相熟的el-upload
<el-upload class="avatar-uploader" action="#" ref="upload" v-loading="loading" list-type="picture-card" :on-success="handleSuccess" :before-upload="uploadBefore" :on-preview="handlePictureCardPreview" :on-remove="handleRemove" :file-list="imgList"> <i class="el-icon-plus"></i></el-upload>
次要的上传办法就是扭转el-upload的默认上传办法
// oss上传图片async uploadBefore(file, loading, column) { this.loading = true; let fileName = this.product + '/' + new Date().getTime() + file.name; let result = await client.put("/picture/" + fileName, file); this.imgList.push({ name: fileName, url: this.url + fileName, fileName: fileName, }); let _this = this; setTimeout(function () { _this.loading = false; }, 600);},
残缺代码如下
<template> <div> <el-upload class="avatar-uploader" action="#" ref="upload" v-loading="loading" list-type="picture-card" :on-success="handleSuccess" :before-upload="uploadBefore" :on-preview="handlePictureCardPreview" :on-remove="handleRemove" :file-list="imgList" > <i class="el-icon-plus"></i> </el-upload> <el-dialog :visible.sync="dialogVisible" :modal-append-to-body="false" :append-to-body="true" > <img width="100%" :src="dialogImageUrl" alt="" /> </el-dialog> </div></template><script>import { getOssToken } from "@/util/common";const OSS = require("ali-oss");let client;export default { name: "uploadImg", props: { product: { default: function () { return '0' }, type: String } }, created() { this.loading = true; getOssToken().then((res) => { this.loading = false; client = new OSS({ // yourRegion填写Bucket所在地区。以华东1(杭州)为例,Region填写为oss-cn-hangzhou。 region: "oss-cn-hangzhou", // 从STS服务获取的长期拜访凭证。长期拜访凭证包含长期拜访密钥(AccessKeyId和AccessKeySecret)和平安令牌(SecurityToken)。 accessKeyId: res.data.accessKeyId, accessKeySecret: res.data.accessKeySecret, stsToken: res.data.securityToken, // 填写Bucket名称。 bucket: "Bucket", }); }); }, data() { return { loading: false, dialogVisible: false, src: "", imgList: [], dialogImageUrl: "", url: "picture/", }; }, methods: { handlePictureCardPreview(file) { this.dialogImageUrl = file.url; this.dialogVisible = true; }, // oss上传图片 async uploadBefore(file, loading, column) { this.loading = true; let fileName = this.product + '/' + new Date().getTime() + file.name; let result = await client.put("/picture/" + fileName, file); this.imgList.push({ name: fileName, url: this.url + fileName, fileName: fileName, }); let _this = this; setTimeout(function () { _this.loading = false; }, 600); }, uploadAfter(res, loading, column) {}, handleRemove(file, fileList) { this.imgList.forEach((item, index) => { if (item.fileName == file.fileName) { this.imgList.splice(index, 1); } }); }, clearFiles() { this.imgList = [] this.$refs.upload.clearFiles(); }, getImList() { return this.imgList; }, //上传胜利 handleSuccess(res, file) { this.imagesUrl = res.data; //图片门路返回给父组件 return this.imgList; }, // 上传胜利之前 对图片格式要求 beforeAvatarUpload(file) { const isPNG = file.type === "image/png"; const isJPG = file.type === "image/jpeg"; const isLt2M = file.size / 1024 / 1024 < 2; if (!isPNG && !isJPG) { this.$message.error("上传图片只能是 JPG 格局和PNG格局!"); } if (!isLt2M) { this.$message.error("上传图片大小不能超过 2MB!"); } return (isPNG && isLt2M) || (isJPG && isLt2M); }, },};</script>