Vue+el-upload批量上传附件,及删除操作

本文详细介绍了如何在Vue项目中使用ElementUI的el-upload组件实现文件上传功能,包括设置上传限制、上传前处理、上传方法以及错误和成功提示。

上代码!!!

HTML标签代码部分:

<el-upload
   class="upload-demo"
   accept=".jpg,.JPG,.png,.PNG"
   action="#"
   :headers="{ 'Justech-Auth': token }"
   :multiple="true"
   :auto-upload="true"
   :limit="5"
   :http-request="uploadFile1"
   :on-exceed="handleExceed"
   :on-preview="downFile"
   :on-remove="fileRemove"
   :before-upload="beforefileListUpload"
   :show-file-list="true"
   :file-list="newFileList">
    <el-button slot="trigger" size="small" type="primary" style="margin-right: 10px" :loading="uploadLoadingBtn">选择文件</el-button>
</el-upload>
<div style="color: red;margin-left: 15px;">* 支持jpg/png格式,最多上传5个文件</div>

js部分:

data() {
   return {
      uploadLoadingBtn: false,
      token: '',
      newFileList: [],// 上传附件集合
   }
},
methods: {
    handleExceed(files, fileList) {
       this.$message.warning('最多上传5个文件!');
    },
    // 上传之前
	beforefileListUpload(file){
		let obj = {
			id:new Date(),
			name: file.name,
			isSuccess: false,
			file:file
		}
		// this.newFileList.push(obj)
	},
    // 上传方法
		uploadFile1(item) {
			this.uploadLoadingBtn = true;
			let formData = new FormData();
			formData.append("files", item.file)
			api.url(formData).then((res) => {
				this.$message.success('上传成功!')
                this.uploadLoadingBtn = false;
                let obj = {
                    id: res.data.data,
                    name: item.file.name,
                    file: item.file,
                    uid: item.file.uid,
                }
                this.newFileList.push(obj)
			}).catch(() => {
				this.$message.error('上传失败!')
				// console.log(this.fileList,'上传失败结果');
			})
		},
		// 删除附件
		fileRemove(file, fileList) {
            this.newFileList = fileList;
            console.log(fileList,'fileLis3333333');
		},
        // 下载
        filePreview(file){
            if(file.url != undefined){
                // 假设文件 URL 为 fileUrl,文件名为 fileName
                const fileUrl = file.url;
                const fileName = file.fileName;
                // 创建一个 <a> 标签
                const link = document.createElement('a');
                link.href = fileUrl;
                // link.download = fileName; // 设置下载的文件名
                link.setAttribute('download', fileName); // 设置下载的文件名
                // 将该 <a> 标签添加到页面上并模拟点击
                document.body.appendChild(link);
                link.click();
                // 清理
                document.body.removeChild(link);
            }
        },
}

至此完成!!!

测试有效!!!感谢支持!!!

在使用 `el-upload` 组件上传图片时,多次触发请求是一个常见问题,通常是由于组件的默认行为和事件监听机制引起的。为了解决这一问题,可以通过自定义上传逻辑、合理设置属性以及利用防抖机制来控制请求次数。 ### 自定义上传方法 通过设置 `auto-upload` 为 `false` 并结合 `:http-request="customUpload"` 属性,可以完全控制文件上传的过程,从而避免多次调用接口。以下是一个示例代码: ```vue <template> <el-upload :action="uploadUrl" :auto-upload="false" :on-change="handleChange" :http-request="customUpload" multiple ref="uploadRef" > <el-button slot="trigger">选取文件</el-button> <el-button @click="submitUpload">提交</el-button> </el-upload> </template> <script> export default { data() { return { uploadUrl: 'your_upload_api_url', }; }, methods: { handleChange(file, fileList) { // 文件状态改变时的处理函数 }, customUpload(options) { // 自定义上传逻辑 const formData = new FormData(); formData.append('file', options.file); // 可以在此处添加其他参数 // formData.append('otherParam', 'value'); // 使用 axios 或 fetch 发起请求 this.$axios.post(this.uploadUrl, formData, { headers: { 'Content-Type': 'multipart/form-data' }, }).then(response => { console.log('上传成功:', response); options.onSuccess(response); }).catch(error => { console.error('上传失败:', error); options.onError(error); }); }, submitUpload() { this.$refs.uploadRef.submit(); } } }; </script> ``` ### 利用防抖机制减少请求次数 在某些情况下,用户可能希望在多个文件选择后统一执行一次上传操作。这时可以采用防抖(debounce)技术来延迟执行上传函数,确保只在最后一次触发时才真正发送请求。以下是如何实现这一点的一个例子: ```javascript import _ from 'lodash'; export default { data() { return { uploadCfg: { validFileList: [], }, }; }, methods: { handleUploadHttp() { this.handleDebounceUpload(); }, handleDebounceUpload: _.debounce(function () { if (_.isEmpty(this.uploadCfg.validFileList)) { return; } let formData = new FormData(); this.uploadCfg.validFileList.forEach((item_file) => { formData.append(`files`, item_file.raw); }); batchUploadApi.uploadXsxx(formData).then(() => { this.$message.success('附件上传成功,请等待数据入库!'); this.uploadCfg.validFileList = []; }).catch(err => { console.log('批量上传附件失败', err); }); }, 20), } }; ``` ### 设置 `show-file-list` 控制显示文件列表 有时,多次触发的问题也可能与文件列表的显示有关。为了简化界面并避免不必要的渲染,可以将 `show-file-list` 设为 `false`,从而隐藏文件列表[^2]。 ```vue <el-upload :on-change="handleUpload" :on-remove="handleRemove" :auto-upload="false" :show-file-list="false" drag action="#" ref="upload" multiple style="display:none;" > <div class="el-upload__text">拖拽文件或点击上传</div> </el-upload> ``` ### 后端接口配置 确保后端接口能够正确接收 `multipart/form-data` 格式的数据,并且支持多文件上传前端代码中应明确指定 `Content-Type` 为 `multipart/form-data`,以便服务器正确解析请求体[^3]。 ```javascript const postForm = function (url, params) { return new Promise((resolve, reject) => { axios({ headers: { 'content-type': 'multipart/form-data' }, method: 'post', url: url, data: params }).then(res => { if (res.status == "200") { resolve(res.data); } else { reject(res); } }); }); }; ``` ### 总结 解决 `el-upload` 多次触发请求的核心思路包括: 1. 使用 `auto-upload="false"` 和 `http-request` 实现完全自定义上传。 2. 利用防抖机制控制批量上传时机。 3. 配置 `show-file-list="false"` 避免额外的渲染干扰。 4. 确保后端接口能正确处理 `multipart/form-data` 数据格式[^1]。 通过上述方法,可以有效解决 `el-upload` 在上传图片时多次触发请求的问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小破孩呦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值