基于element-upload的自定义图片裁剪上传

  • 核心代码
<el-upload
	list-type="picture-card"
	action=""
	:auto-upload="false"
	:show-file-list="false"
	:on-change="changeUpload"
>
<img v-if="pic.file_url"
	:src="pic.file_url"
	:width="150"
	:height="150"
>
<i v-else class="el-icon-plus avatar-uploader-icon">
</i>
<el-dialog
	title="图片裁剪"
	:visible.sync="dialogVisible"
	append-to-body
>
	<div>
		<div class="cropper">
			<vueCropper
				ref="cropper"
				:img="option.img"
				:output-size="option.size"
				:output-type="option.outputType"
				:info="true"
				:full="option.full"
				:can=move="option.canMove"
				:can-move-box="option.canMoveBox"
				:original="option.original"
				:auto-crop="option.autoCrop"
				:center-box="option.centerBox"
				:info-true="option.infoTrue"
				:fixed-box="option.fixedBox"
				:auto-crop-width="option.autoCropWidth"
				:auto-crop-height="option.autoCropHeight"
				@realTime="realTime"
			/>
		</div>
	</div>	
	<div
		slot="footer"
		class="dialog-footer"
	>
		<el-button @click="dialogVisible=false">
			取消
		</el-button>
		<el-button 
			type="primary"
			:loading="loading"
			@click="finish"
		>
			确认
		</el-button>
	</div>
</el-dialog>
import {fileLimit} from '@u/util/util'
props:{
	fileUrl:{
		type:String,
		default:'',
		require:true
	}
},
data(){
	return{
		dialogVisible:false,
		option:{
			img:'',//裁剪图片地址
			info:true,//裁剪框大小信息
			outputSize:1,//裁剪生成图片质量
			outputType:'jpeg',//裁剪生成图片格式
			canScale:true,//图片是否允许缩放
			autoCrop:true,//是否默认生成截图框
			autoCropWidth:200,//默认生成截图框宽度
			autoCropHeight:200,//默认生成截图框高度
			fixedBox:false,//固定截图框大小
			full:false,//是否输出原图比例截图,
			canMove:true,//截图框是否可移动
			canMoveBox:true,//截图框是否拖动
			original:false,//上传图片按照原始比例渲染
			centerBox:true,//截图框是否被限制在图片里面
			infoTrue:true//true 为展示真实输出图片宽高
		},
		pic:{
			'file_url':this.fileUrl
		},
		loading:false,
		fileInfo:'',
		previews:''
	}
},
watch:{
	fileUrl(newVal){
		if(newVal){
			this.pic.file_url=newVal
		}
	}
},
methods:{
	//限制图片大小
	changeUpload(file,fileList){
		const body = fileLimit(file,['jpg','png','jpeg'])
		if(body.limit){
			this.$message.error(body.error)
			return !body.limit
		}
		this.fileInfo=file
		this.$nextTick(()=>{
			this.option.img=URL.createObjectURL(file.raw)
			this.dialogVisible=true
		})
	},
	realTime(data){
		this.previews=data
	},
	finish(){
		this.$refs.cropper.getCropBlob((data)=>{
			this.loading=true
			const form=new FormData()
			form.append('file',data,this.fileInfo.name)
			this.$http.request({
				url:'/shec/common/upload/',
				method:'post',
				headers:{'Content-Type','multipart/form-data'},
				data:form
			}).then(res=>{
				if(res.data.result){
					this.pic={
						this.pic={
							'file_url':res.data.data.file_url,
							'original_file_name':res.data.data.original_file_name,
							'width':this.previews.w,
							'height':this.previews.h,
							'file_name':res.data.data.file_name,
							'file_size':res.data.data.file_size,
							'file_type':res.data.data.file_type,
							'path':res.data.data.path
						}
						this.$emit('on-success',this.pic)
					}
				}
			})
		}).finally(()=>{
			this.dialogVisible=false
			this.loading=false
		})
	}	
}
您好,关于 element-ui 的上传组件 el-upload,您可以通过自定义 el-upload-list 来实现自定义上传列表的功能。 具体实现方法如下: 1. 在 el-upload 组件中添加属性 list-type="picture-card",并设置属性 action 为上传文件的地址。 2. 在 el-upload 组件中添加自定义 slot,用于自定义上传列表的显示。 3. 在自定义上传列表组件中,使用 el-upload-list 组件来展示上传文件的列表。 4. 可以通过监听 el-upload 组件的 change 事件来获取上传的文件信息,并将上传的文件信息传递给自定义上传列表组件,以展示上传文件的列表。 以下是一个简单的示例代码: ```html <template> <div> <el-upload class="upload-demo" action="/upload" list-type="picture-card" :on-change="handleChange" > <i class="el-icon-plus"></i> <div class="upload-text">上传图片</div> </el-upload> <custom-upload-list :file-list="fileList"></custom-upload-list> </div> </template> <script> import CustomUploadList from './CustomUploadList.vue'; export default { components: { CustomUploadList, }, data() { return { fileList: [], }; }, methods: { handleChange(file, fileList) { this.fileList = fileList; }, }, }; </script> ``` CustomUploadList.vue 组件的代码如下: ```html <template> <el-upload-list class="custom-upload-list" :file-list="fileList"> <template slot-scope="{file}"> <div class="custom-list-item"> <img :src="file.url" class="custom-list-item-thumbnail"> <div class="custom-list-item-name">{{ file.name }}</div> <div class="custom-list-item-actions"> <el-button size="small" type="text" @click="handleRemove(file)">删除</el-button> </div> </div> </template> </el-upload-list> </template> <script> export default { props: { fileList: { type: Array, default: () => [], }, }, methods: { handleRemove(file) { const index = this.fileList.indexOf(file); if (index !== -1) { this.fileList.splice(index, 1); } }, }, }; </script> ``` 希望这个示例能够帮助到您。如果您有任何问题,请随时提出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值