html实现拖拽上传

最近公司需要有一个拖拽上传的功能,但是由于在开发前,使用的组件库内没有拖拽上传的例子,所以我在这里写一个拖拽上传的功能😁.

首先写一个组件(拖拽上传的组件)

1. 这里上传成功后的提示用的是primevue组件库,可以不用管

2. 目前这里只是单文件上传,如果有需求可以自行更改

3. 这里有用到Bootstrap5的class,所以html部分的样式需要自己更改

4. 目前这边就是按钮上传以及拖拽上传

<template>
	<div v-if="type === 0">
		<a @click="handleClickUpload" class="btn btn-primary">{{buttonText}}</a>
		<input @change="handleUpload" :multiple="isMultiple" ref="uploadRef" type="file" class="d-none" />
	</div>
	<div v-else-if="type === 1" :style="{'width': width, 'height': height}" class="upload-component position-relative">
		<div class="h-100 w-100 position-absolute z-index-1">
			<input @change="handleUpload" :multiple="isMultiple" type="file" />
		</div>
		<img v-if="uploadImageUrl" :src="uploadImageUrl" alt="..." class="w-100 h-100 position-absolute top-0" style="object-fit: cover;" />
		<div v-else class="upload-tips">{{uploadTips}}</div>
	</div>
</template>

<script lang="ts">
import { defineComponent, reactive, toRefs, watchEffect, ref } from 'vue';
import { useToast } from "primevue/usetoast";

export default defineComponent({
	name: "upload-component",
	props: {
		// 组件的类型 - 0: 按钮  1: 拖拽
		type: {
			type: Number,
			default: 0,
		},
		// 上传类型 - 0: 图片  补充...
		uploadType: {
			type: Number,
			default: 0,
		},
		// 是否支持上传多个
		isMultiple: {
			type: Boolean,
			default: false,
		},
		// 图片路径(上传成功后回显 - 仅单张图片) - 拖拽类型生效
		uploadImageUrl: {
			type: String,
			default: "",
		},
		// 宽度 - 拖拽类型生效
		width: {
			type: String,
			default: "200px",
		},
		// 高度 - 拖拽类型生效
		height: {
			type: String,
			default: "200px",
		},
		// 上传的文字提示
		uploadTips: {
			type: String,
			default: "将图片拖放到此处或点击上传",
		},
		// 上传按钮的文字
		buttonText: {
			type: String,
			default: "点击上传",
		},
	},
	setup(props, { emit }) {
		const toast = useToast();
		const uploadRef = ref();
		const state = reactive({
			// 组件的类型
			type: props.type,
			// 允许上传的类型
			uploadType: props.uploadType,
			// 是否支持上传多个
			isMultiple: props.isMultiple,
			// 图片路径(上传成功后回显 - 仅单张图片)
			uploadImageUrl: props.uploadImageUrl,
			// 上传的文字提示
			uploadTips: props.uploadTips,
			// 宽度
			width: props.width,
			// 高度
			height: props.height,
			// 上传的地址
            uploadFileUrl: "这边是上传的路径地址",
		});

		/** 监听... */
		watchEffect(() => {
			state.type = props.type;
			state.uploadType = props.uploadType;
			state.uploadImageUrl = props.uploadImageUrl;
			state.isMultiple = props.isMultiple;
		});

		/** 处理点击上传 */
		const handleClickUpload = () => {
			uploadRef.value.click();
		}

		/** 处理上传之前的钩子 */
		const handleBeforeUpload = (files: any) => {
			let result = true;
			// 判断上传类型
			for(const item of files) {
				if(state.uploadType === 0 && !item.type.includes("image")) {
					result = false;
					break;
				}
			}

			if(!result) {
				toast.add({severity: 'warn', summary: '提示', detail: '当前上传的文件类型不支持', life: 1500});
				return result;
			}
			return result;
		}

		/** 处理上传成功后 */
		const handleAfterUpload = (files: any) => {
			// 目前只是单个上传 - 多个上传以后需求用到再改
			let file = null as any;
			if(!state.isMultiple) {
				file = files[0];
			}
			else {
				file = files[0];
			}

			// 将file文件设置成form数据
			const fileForm = new FormData();
			fileForm.append("file", file);

			// 创建XMLHttpRequest对象
			const xhr = new XMLHttpRequest();
			// 设置请求方式以及路径
			xhr.open("POST", state.uploadFileUrl);
			// 发送请求
			xhr.send(fileForm);
			// 监听请求的结果
			xhr.addEventListener("load", () => {
				const response = JSON.parse(xhr.response);
				toast.add({severity: 'success', summary: '提示', detail: '上传成功', life: 1500});
				emit("handleUploadSuccess", response);
			});
		}

		/** 处理上传操作 */
		const handleUpload = (event: any) => {
			// 上传之前
			if(!handleBeforeUpload(event.target.files)) {
				return;
			}

			// 上传后
			handleAfterUpload(event.target.files);
		}

		return {
			...toRefs(state),
			uploadRef,
			handleUpload,
			handleBeforeUpload,
			handleClickUpload,
		}
	}
});
</script>

<style scoped lang="scss">
	.upload-component {
		width: 400px;
		height: 400px;
		border-radius: 4px;
		border: 1px dashed #d9d9d9;
		background: #f5f5f5;
		cursor: pointer;
		position: relative;
		overflow: hidden;
		&:hover {
			transition: .2s;
			border-color: #409eff;
		}

		.upload-tips {
			font-size: 12px;
			color: #999;
			line-height: 20px;
			position: absolute;
			top: 50%;
			left: 50%;
			transform: translate(-50%, -50%);
            text-align: center;
			width: 70%;
		}

		input {
			cursor: pointer;
			width: 100%;
			height: 100%;
			position: absolute;
			left: 0;
			padding-bottom: 30px;
			transform: translateY(-30px);
			box-sizing: content-box;
		}
	}
</style>

最后就是引入组件使用就好,组件引入很简单这里就不展示代码,效果图是:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现粘贴或拖拽上传文件,你可以使用HTMLJavaScript来完成。下面是一个简单的示例代码: HTML部分: ```html <div id="drop-area"> <div class="drop-message">将文件拖拽到此处或点击选择文件</div> <input type="file" id="file-input" multiple> </div> ``` CSS部分: ```css #drop-area { width: 300px; height: 200px; border: 2px dashed #ccc; text-align: center; padding: 40px; margin: 20px auto; } .drop-message { font-size: 18px; color: #999; } #drop-area.dragover { border-color: #000; } ``` JavaScript部分: ```javascript // 获取相关的元素 var dropArea = document.getElementById('drop-area'); var fileInput = document.getElementById('file-input'); // 阻止默认的拖拽事件 ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => { dropArea.addEventListener(eventName, preventDefaults, false); }); function preventDefaults(e) { e.preventDefault(); e.stopPropagation(); } // 添加拖拽样式 ['dragenter', 'dragover'].forEach(eventName => { dropArea.addEventListener(eventName, highlight, false); }); ['dragleave', 'drop'].forEach(eventName => { dropArea.addEventListener(eventName, unhighlight, false); }); function highlight(e) { dropArea.classList.add('dragover'); } function unhighlight(e) { dropArea.classList.remove('dragover'); } // 处理文件上传 dropArea.addEventListener('drop', handleDrop, false); function handleDrop(e) { var files = e.dataTransfer.files; handleFiles(files); } fileInput.addEventListener('change', handleFiles, false); function handleFiles(files) { for (var i = 0; i < files.length; i++) { uploadFile(files[i]); } } function uploadFile(file) { var formData = new FormData(); formData.append('file', file); // 在这里执行上传文件的逻辑,例如使用Ajax发送formData到服务器 // 这里只是一个简单的示例,你需要根据实际情况进行修改 var xhr = new XMLHttpRequest(); xhr.open('POST', '/upload', true); xhr.onload = function() { if (xhr.status === 200) { console.log('文件上传成功!'); } else { console.error('文件上传失败!'); } }; xhr.send(formData); } ``` 以上代码实现一个简单的拖拽或粘贴上传文件的功能。当用户将文件拖拽到指定区域时,或者点击选择文件按钮选择文件后,会触发对应的事件处理函数。你可以根据实际需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值