在项目需求中,关于图片、视频、文件等上传文件,一般不是直接放置在自己的后台服务器上,一般都会购买云服务进行存储。譬如阿里云的oss对象存储。
前端开发项目中,涉及到上传的功能时,我们不是把文件上传到自己的后台服务器,而是阿里云上面去,然后拿到文件的访问地址,例如图片的地址,再传递给后台保存下来,保存的是一个阿里云存储地址。
官方文档上说了:(阿里云oss文档地址:https://help.aliyun.com/document_detail/112718.html)
1、使用阿里云上传的SDK来上传到阿里云oss
2、不使用sdk的方式,直接使用post表单提交到阿里云oss去
3、小程序(忽略)
其实,也就两种。要么使用阿里云给的sdk,他封装的上传方法等;要么使用表单提交,像提交到我们自己服务器一样。
阿里云oss SDK上传: https://help.aliyun.com/document_detail/64047.htm?spm=a2c4g.11186623.0.0.119f3967Xq1Eb8#concept-64047-zh
这种方式,需要安装依赖包或引入js文件: npm install ali-oss
新建oss.js文件,封装一下 :
const OSS = require('ali-oss') export default { /** * 阿里云oss sdk文件上传
dir 上传到的文件位置 * @param {*} file 文件流 * @param {*} successCallback 成功回调 * @param {*} errCallBack 失败回调 * @param {*} bucketName 阿里云桶名(可以指定多个桶名) * @param {*} dir 上传文件夹路径 譬如images */ bucketUpload(file, successCallback = new Function(), errCallBack = new Function(), bucketName = 'zzl-filerepostorypublic', dir = 'image') { let fileName = file.name// 先获取上传要的资料签名 req.getUploadVoucher().then((res) => { if (res.code === 0) { let obj = res.result.filePath.credentials || {} let config = {} config.host = obj.OssUrl // 实例化一个上传客户端 const client = new OSS({ // yourRegion填写Bucket所在地域。Region填写为oss-cn-hangzhou。 // region: "oss-cn-beijing", //我的存储是北京,可根据具体配置自行修改 region: 'oss-cn-shanghai', // 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。)(后台接口返回) accessKeyId: obj.accessKeyId, accessKeySecret: obj.accessKeySecret, // 从STS服务获取的安全令牌(SecurityToken)。 stsToken: obj.securityToken, // 填写Bucket名称。 bucket: 'zzl-filerepostorypublic', endpoint:"https://oss-cn-shanghai.aliyuncs.com" }) try {// 为保证唯一性,可以通过uuid将文件名替换 // let uuid = uuidv4() + fileName.substring(fileName.lastIndexOf('.'))if (dir.substring(dir.length - 1, 1) !== '/') { dir += '/' }const result = client.put(dir + fileName, file) result .then(res => { console.log(res,"返回文件名和文件地址") let size = file.size > 1000000 ? parseFloat(file.size / 1000000).toFixed(2) + 'M' : parseFloat(file.size / 1000).toFixed(2) + 'KB' successCallback({ attachment: fileName, aliyunAddress: res.url, size: size, host: config.host }) }) .catch(err => { errCallBack(err) }) } catch (e) { console.log(e) } } else { // _this.$message.warning(res.msg); } }); } }
vue 页面的代码:
<el-upload class="upload-demo" :file-list="fileList1" action="" :http-request="handleUpload" :on-success="handleZipSuccess" > <el-button size="small" type="primary">点击上传</el-button> <div slot="tip" class="el-upload__tip"> 支持扩展名:.ppt、.pdf、.zip、.doc、.docx </div> </el-upload>import common from './oss'
//手动上传的方法
handleUpload(op) { let bucketName = 'zzl-filerepostorypublic'; // 桶名 let dir = `images`; common.bucketUpload( op.file, (res) => { let temp = { name: res.attachment, url: res.aliyunAddress }; this.host = res.host; op.onSuccess(temp); console; }, (err) => { console.log(err); }, bucketName, dir ); }, //上传成功的方法 handleZipSuccess(file) { this.fileList1 = []; this.fileList1.push({ fileName: file.name, name: file.name }); console.log(file, '阿里云返回的文件地址和文件名称'); this.form.fileAddressId = file.url; this.form.handoutName = file.name; this.form.handoutType = file.name.replace(/.+\./, ''); },
页面效果:
参照:https://blog.csdn.net/qq_42991509/article/details/122967392
标签:vue,res,oss,element,阿里,file,上传,dir From: https://www.cnblogs.com/ZYSZBD/p/16960702.html