Elementui 上传文件图片功能

 这个是我根据我公司的需求去做的一个操作,有很多不全的地方,还需你们自己加,我公司的代码比较老,使用layui做的弹出层做的,所以需要去地址栏截取参数

<div id="app">
    <el-upload
		  class="upload-demo"
		  action
		  :accept="accept"
		  :on-preview="handlePreview"
		  :on-remove="handleRemove"
		  :on-progress="uploadSectionFile"
		  :before-upload="beforeUpload"
		  :file-list="fileList"
		  :limit="limit"
		  :on-exceed="onExceed"
		  :list-type="picture">
		  <el-button size="small" type="primary">点击上传</el-button>
		  <div slot="tip" class="el-upload__tip">文件不能超过{{Size}}M</div>
	</el-upload>
</div>

 

var vm=new Vue({
	el:"#app",
	data() {
		return {
			fileList:[],
			limit:5,
			fileType:1,
			accept:'image/*',
			Size:15,
			imgId:[],
			url:r.api + '/common/upload/files',
			picture:'picture'
		}
	},
	created() {
		/**
		 * 上传时候携带的参数有默认的
		 * @param {limit}  = [上传数量] 
		 * @param {fileType}  = [上传的种类] //后续可加视频等
		 * @param {size}  = [上传的文件大小] 
		 */
		this.limit=getUrlValue()["limit"]?getUrlValue()["limit"]*1:5
		this.fileType=getUrlValue()["fileType"]?getUrlValue()["fileType"]*1:1
		this.accept=this.fileType==1?'image/*':'application/msword,application/pdf,text/plain,application/vnd.ms-excel'
		this.Size=getUrlValue()["size"]?getUrlValue()["size"]*1:15
		this.picture=this.fileType==1?'picture':'text'
	},
	methods:{
		handleRemove(file, fileList) {
			let index =null
			this.fileList.forEach((item,i)=>{
				if(file.uid==item.uid){
					index=i
				}
			})
			this.fileList=fileList
			console.log(index)
			if(index!=null){
				this.imgId.splice(index,1)
			}
			console.log(this.imgId)
		},
		handlePreview(file) {
			console.log(file);
		},
		beforeUpload(file){
			let show =true
			if(file.size>this.Size*1024*1024){
				utils.dialog.alert("文件大小以超出设定!")
				return show=false
			}
			this.fileList.forEach(item=>{
				if(file.name==item.name){
					show=false
					utils.dialog.alert("请勿重复上传!")
				}
			})
			return show
		},
		uploadSectionFile(event, file, fileList){
			var _this=this
			this.fileList=fileList
			let formdata=new FormData()
			if(this.fileType==1){
				const fileF = file.raw;
				const fileName=file.name
				const fileType = fileF.type;
				const reader = new FileReader();
				reader.readAsDataURL(fileF);
				reader.onload = function() {
					const image = new Image();
					image.src = this.result;
					image.onload = function(e) {
						const canvas = document.createElement("canvas");
						let context = canvas.getContext("2d");
						// 图片原始尺寸
						const originWidth = this.width;
						const originHeight = this.height;
						let targetWidth = originWidth;
						let targetHeight = originHeight;
						// canvas对图片进行缩放
						canvas.width = targetWidth;
						canvas.height = targetHeight;
						// 清除画布
						context.clearRect(0, 0, targetWidth, targetHeight);
						// 图片压缩
						context.drawImage(image, 0, 0, targetWidth, targetHeight);
						const type = "image/jpeg";
						//将canvas元素中的图像转变为DataURL
						const dataurl = canvas.toDataURL(type,0.2);
						//抽取DataURL中的数据部分,从Base64格式转换为二进制格式
						// const bin = atob(dataurl.split(",")[1]);
						//创建空的Uint8Array
						// const buffer = new Uint8Array(bin.length);
						let arr = dataurl.split(','),
						    mime = arr[0].match(/:(.*?);/)[1],
						    bstr = atob(arr[1]),
						    n = bstr.length,
						    u8arr = new Uint8Array(n);
						while (n--) {
						    u8arr[n] = bstr.charCodeAt(n);
						}
						let files = new File([u8arr], fileName, {type: mime});
						files.lastModifiedDate = new Date();
						formdata.append("name",fileName)
						formdata.append("file",files)
						formdata.append("type",1)
						_this.setUpdata(formdata)
					};
				};
			}else{
				formdata.append("name",file.name)
				formdata.append("file",file.raw)
				formdata.append("type",1)
				_this.setUpdata(formdata)
			}
		},
		setUpdata(formdata){
			var _this=this
			$.ajax({
				url: this.url,
				type: 'POST',
				data: formdata,
				headers: {"Authorization": utils.getToken()},
				processData: false,
				contentType: false,
				dataType: 'json',
				success:function (res) {
					if(res.data){
						_this.imgId.push(res.data.fileId)
					}
				}
				,error:function (res) {
					console.log(res)
				}
			});
		},
		onExceed(files, fileList){
			utils.dialog.alert("已超过数量限制!")
		}
	}
})

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现ElementUI上传图片文件预览,可以使用el-upload组件的on-preview属性来实现。具体的实现思路如下: 1. 在el-upload组件中,设置on-preview属性为一个方法名,例如previewFile。 2. 在methods中定义previewFile方法,该方法接收一个参数file,代表待预览的文件。 3. 在previewFile方法中,判断文件的类型。如果是图片文件(如png、jpg、jpeg),则可以直接使用window.open方法打开文件的URL进行预览。 4. 如果文件类型不是图片文件,可以给出相应的提示信息,告知该文件类型暂不支持预览。 以下是代码示例,演示了如何使用ElementUIel-upload和on-preview属性实现图片文件的预览功能: ```html <template> <el-upload action="/upload" list-type="picture-card" :on-preview="previewFile" > <i class="el-icon-plus"></i> </el-upload> </template> <script> export default { methods: { previewFile(file) { const fileType = file.name.split('.').pop().toLowerCase(); if (['png', 'jpg', 'jpeg'].includes(fileType)) { window.open(file.url); } else { this.$message({ message: '该文件类型暂不支持预览', type: 'warning', }); } }, }, }; </script> ``` 通过以上代码,当用户点击上传的图片文件时,将会通过window.open方法在新窗口中打开图片文件进行预览。如果上传的文件类型不是图片文件,则会显示一个警告提示,告知该文件类型暂不支持预览。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SpringBoot ElementUI 文件上传和预览](https://blog.csdn.net/zhouzhiwengang/article/details/108289673)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Vue+ElementUI使用vue-pdf实现预览功能](https://download.csdn.net/download/weixin_38626242/12931474)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [vue实战--vue+elementUI实现多文件上传+预览(word/PDF/图片/docx/doc/xlxs/txt)](https://blog.csdn.net/qq_46617584/article/details/127796486)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值