vue+element-ui+el-upload+ oss 阿里云上传视频和图片(前端处理)

vue+element-ui+el-upload+ oss 阿里云上传视频和图片(前端处理)

1.安装 oss 依赖包
npm install ali-oss --save
2.新建 oss.js 
// 引入ali-oss
let OSS = require('ali-oss')
/**
阿里云配置
 *  [accessKeyId] {String}:通过阿里云控制台创建的AccessKey。
 *  [accessKeySecret] {String}:通过阿里云控制台创建的AccessSecret。
 *  [bucket] {String}:通过控制台或PutBucket创建的bucket。
 *  [region] {String}:bucket所在的区域, 默认oss-cn-hangzhou。
 */
export function client() {  return new OSS({
    region: '',
    accessKeyId: '',
    accessKeySecret:  '',
    bucket: ''
  })
}

/**
 * 生成随机文件名称
 * 规则八位随机字符,加下划线连接时间戳
 */
export const getFileNameUUID = () => {
  function rx() {
    return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1)
  }
  return `${+new Date()}_${rx()}${rx()}`
}
3.在页面中使用el-upload组件
<el-form-item label="视频/图片上传" prop="Video">
		<el-upload action :http-request="Upload" :on-preview="handlePreview" :before-remove="beforeRemove" :on-remove="handleRemove"
					 :on-success="handleSuccess" :on-exceed="handleExceed" drag :limit="limit" :file-list="fileList">
				<i class="el-icon-upload"></i>
				<div class="el-upload__text">
					将文件拖到此处,或
					<em>点击上传</em>
				</div>
			<div slot="tip" class="el-upload__tip">上传文件大小不能超过 1G</div>
		</el-upload>

		<el-progress v-show="showProgress" :text-inside="true" :stroke-width="15" :percentage="progress"></el-progress>

</el-form-item>

4.在script标签中引入刚才新建的oss.js文件
import {client,getFileNameUUID} from "../stroe/oss"; //client,getFileNameUUID是前面的oss.js文件内的两个封装函数,我是放在store文件夹下的
	export default {
		name: "Upload",
		props: {
			limit: {
				type: Number,
				default: 1
			}
		},
		data(){
		return {
		  fileList: [], //文件列
		  showProgress: false, //进度条的显示
		  dataObj: {}, //存签名信息
		  progress: 0 //进度条数据
		  }
		}
  }
5.在methods中定义方法
        // 文件超出个数限制时的钩子
			handleExceed(files, fileList) {
				this.$message.warning(`每次只能上传 ${this.limit} 个文件`);
			},
			// 点击文件列表中已上传的文件时的钩子
			handlePreview(file) {},
			// 删除文件之前的钩子
			beforeRemove(file, fileList) {
				return this.$confirm(`确定移除 ${file.name}?`);
			},
			// 文件列表移除文件时的钩子
			handleRemove(file, fileList) {},
			// 文件上传成功时的钩子
			handleSuccess(response, file, fileList) {
				this.fileList = fileList;
			},
			//文件上传前的校验
			beforeAvatarUpload(file) {
				const isLt100M =
					file.size / 1024 / 1024 > 10 && file.size / 1024 / 1024 < 1024;
				const isLt30 = file.name.length < 30;
				if (["video/mp4"].indexOf(file.type) == -1) {
					this.$message.error("请上传正确的视频格式");
					return false;
				}
				if (!isLt100M) {
					this.$message.error("上传视频大小要在10MB~1GB之间哦!");
					return false;
				}
				if (!isLt30) {
					this.$message.error("上传视频文件名称长度必须要小于30个文字哦!");
					return false;
				}
			},
			// http-request属性来覆盖默认的上传行为(即action="url"),自定义上传的实现
			//multipartUpload方法查看官方文档[添加链接描述](https://www.alibabacloud.com/help/zh/doc-detail/31995.htm)
			Upload(file) {
				const that = this;
				async function multipartUpload() {
					let temporary = file.file.name.lastIndexOf(".");
					let fileNameLength = file.file.name.length;
					let fileFormat = file.file.name.substring(
						temporary + 1,
						fileNameLength
					);
					let fileName = getFileNameUUID() + "." + fileFormat;
					client(that.dataObj)
						.multipartUpload(`image/${fileName}`, file.file, {
							progress: function(p) {
								//p进度条的值
								console.log(p);
								that.showProgress = true;
								that.progress = Math.floor(p * 100);
							}
						})
						.then(result => {
							//上传成功返回值,可针对项目需求写其他逻辑
							console.log(result);
						})
						.catch(err => {
							console.log("err:", err);
						});
				}
				multipartUpload();

			}
6.oss阿里云
  (一)申请创建bucket
       [创建bucket](https://jingyan.baidu.com/article/4dc40848d5226988d846f174.html)
        获取   [bucket] {String}:通过控制台或PutBucket创建的bucket。
               [region] {String}:bucket所在的区域, 默认oss-cn-hangzhou。
  (二)申请创建accessKey
      [accessKeyId] {String}:通过阿里云控制台创建的AccessKey。
      [accessKeySecret] {String}:通过阿里云控制台创建的AccessSecret。
      [创建accessKey](https://jingyan.baidu.com/article/8275fc86f2c6bb06a13cf674.html)
    
7.因为前端直接处理,所以将accessKeyId,accessKeySecret直接暴露不利于安全,后续可以添加stsToken给一个时效性
  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,针对您的问题,以下是实现 Vue+Element-UI上传图片并压缩的基本步骤: 1. 安装依赖 在项目中安装 Element-UI 和插件 vue-image-crop-upload 以及图片压缩库,可使用以下命令: ``` npm install element-ui vue-image-crop-upload compressjs --save ``` 2. 引入 Element-UI 在 main.js 中引入 Element-UI: ```javascript import Vue from 'vue' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' Vue.use(ElementUI) ``` 3. 使用 vue-image-crop-upload 在需要上传图片的组件中使用 vue-image-crop-upload,可使用以下代码: ```vue <template> <div> <vue-image-crop-upload ref="upload" :url="uploadUrl" :headers="uploadHeaders" :size="size" :accept="accept" :beforeUpload="beforeUpload" :cropConfig="cropConfig" :compressConfig="compressConfig" @input="handleInput" @crop-success="handleCropSuccess" > <el-button size="small" type="primary">上传图片</el-button> </vue-image-crop-upload> </div> </template> <script> import VueImageCropUpload from 'vue-image-crop-upload' export default { components: { VueImageCropUpload }, data() { return { uploadUrl: 'xxx', // 上传地址 uploadHeaders: { // 上传请求头 Authorization: 'Bearer ' + getToken() }, size: 1024 * 1024 * 2, // 上传图片大小限制 accept: '.jpg,.jpeg,.png', // 上传图片格式限制 cropConfig: { // 图片裁剪配置 aspectRatio: 1 / 1, autoCropArea: 1, viewMode: 1, zoomable: false, guides: false, dragMode: 'move', cropBoxResizable: false, crop: () => {} }, compressConfig: { // 图片压缩配置 targetSize: 1024 * 1024, // 目标大小 quality: 0.7, // 压缩质量 mimeType: 'image/jpeg' // 输出格式 } } }, methods: { beforeUpload(file) { // 文件上传前的回调函数 this.$refs.upload.startUpload() }, handleInput(file) { // 文件选择后的回调函数 this.$refs.upload.showCrop() }, handleCropSuccess(blob, file) { // 图片裁剪成功后的回调函数 this.compressImage(blob, file) // 压缩图片 }, compressImage(blob, file) { // 图片压缩 const reader = new FileReader() reader.readAsDataURL(blob) reader.onload = (e) => { const base64 = e.target.result const compressedBlob = Compress.compress(base64, this.compressConfig) const compressedFile = new File([compressedBlob], file.name, { type: compressedBlob.type }) this.$emit('upload', compressedFile) // 触发上传事件 } } } } </script> ``` 4. 完成上传 在父组件中监听上传事件,使用 axios 或其他方法上传文件至服务器: ```vue <template> <div> <upload :action="uploadUrl" @upload="handleUpload"></upload> </div> </template> <script> import axios from 'axios' import Upload from './Upload.vue' export default { components: { Upload }, data() { return { uploadUrl: 'xxx' // 上传地址 } }, methods: { handleUpload(file) { const formData = new FormData() formData.append('file', file) axios.post(this.uploadUrl, formData).then(response => { console.log(response.data) }) } } } </script> ``` 以上就是实现 Vue+Element-UI上传图片并压缩的基本步骤,您可以根据您的具体需求进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值