使用el-upload组件遇到的坑。

1.第一种感觉最好,首先多个文件是一个http请求,另外还可以传除文件外其他的参数,但是没有进度条了。

发送请求的部分没有注释的部分是我分装了调后台的api,注释的部分是直接调。

注意如果使用自定义提交http-request,则on-success和on-error这两个钩子函数会不起作用,另外点击事件submitUpload中的this.$refs.uploadFiles.submit();是必须的,个人感觉是先将所有的文件给el-form处理,

我发先执行this.$refs.uploadFiles.submit();会多次执行handleUpload函数,次数与要上传文件的个数一样。

fileList: [], files: []要在data中先定义好,file是在form默认有的,是选进来的一个文件。action此时是无用的,但是必须要设置。

<template>
<el-form>
<div class="drop-upload-container">
<el-form-item :label-width="formLabelWidth">
<el-upload
multiple
drag
ref="uploadFiles"
:action="action"
:limit="limit"
:auto-upload="autoUpload"
:accept="accept"
:before-upload="beforeUploadFile"
:on-remove="handleRemove"
:on-change="fileChange"
:on-exceed="exceedFile"
:http-request="handleUpload"
:file-list="fileList"
>
<i class="el-icon-upload"></i>
<div class="el-upload__text">
{{ $t('upload.uploadText') }}
<em>{{ $t('upload.clickUpload') }}</em>
</div>
<div class="el-upload__tip" slot="tip">{{ $t('upload.uploadFileType') }}</div>
</el-upload>
</el-form-item>
<el-form-item class="item-container">
<el-button
size="small"
type="primary"
@click.native="submitUpload"
>{{ $t('buttonTitle.okTitle') }}</el-button>
<el-button size="small" @click.native="uploadCancle">{{ $t('buttonTitle.cancleTitle') }}</el-button>
</el-form-item>
</div>
</el-form>
</template> <script>
import { stringFormat } from "@/utils/stringutils";
import axios from "axios";
import { uploadFilesReq } from "@/api/upload"; export default {
name: "Upload",
props: {
action: {
required: true,
type: String
},
limit: {
required: true,
type: Number
},
autoUpload: {
type: Boolean,
default: false
},
accept: {
required: true,
type: String
}
},
data() {
return {
formLabelWidth: "80px",
userIds: sessionStorage.getItem("userid"),
fileList: [],
files: []
};
},
methods: {
// 文件超出个数限制时的钩子
exceedFile(files, fileList) {
console.log("===exceed===");
let limit_num = `${this.limit}`;
let total_num = `${files.length + fileList.length}`; this.$notify.warning({
title: this.$i18n.t("dialogTitle.dialogWarningTitle"),
//message: `只能选择 ${this.limit} 个文件,当前共选择了 ${files.length + fileList.length} 个`
message: stringFormat(
this.$i18n.t("uploadDialogMsg.uploadFilesLimit"),
[`${this.limit}`, `${files.length + fileList.length}`]
)
});
},
// 文件状态改变时的钩子
fileChange(file, fileList) {
console.log("===change===");
},
// 上传文件之前的钩子, 参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传
beforeUploadFile(file) {
console.log("before upload");
console.log(file);
let extension = file.name.substring(file.name.lastIndexOf(".") + 1);
const isAcceptFiles =
extension === "xlsx" ||
extension === "vue" ||
extension === "png" ||
extension === "PNG";
if (!isAcceptFiles) {
this.$notify.warning({
title: this.$i18n.t("dialogTitle.dialogWarningTitle"),
message: this.$i18n.t("uploadDialogMsg.uploadFilesType")
});
} let size = file.size / 1024 / 1024;
const isAcceptSize = size < 10;
if (!isAcceptSize) {
this.$notify.warning({
title: this.$i18n.t("dialogTitle.dialogWarningTitle"),
message: this.$i18n.t("uploadDialogMsg.uploadFilesSize")
});
}
return isAcceptFiles && isAcceptSize;
},
// 点击x时执行的钩子函数
handleRemove(file, fileList) {
console.log("===remove===");
}, handleUpload(raw) {
this.files.push(raw.file);
},
submitUpload() {
this.$refs.uploadFiles.submit();
let fd = new FormData();
fd.append("userIds", this.userIds);
this.files.forEach(file => {
fd.append("file", file, file.name);
}); let config = {
headers: {
"Content-Type": "multipart/form-data"
}
}; uploadFilesReq(fd, config)
.then(res => {
console.log("===upload rep===");
console.log(res);
if (res.data.status === "success") {
       this.files = [];
       this.$refs.uploadFiles.clearFiles();
       this.$notify.success({
title: this.$i18n.t("dialogTitle.dialogSuccessTitle"),
message: this.$i18n.t("uploadDialogMsg.uploadFilesSuccess")
});
} else {
this.$notify.error({
title: this.$i18n.t("dialogTitle.dialogErrorTitle"),
message: this.$i18n.t("uploadDialogMsg.uploadFilesFailed")
});
}
})
.catch(err => {
console.log("===upload error===");
console.log(err);
this.$notify.error({
title: this.$i18n.t("dialogTitle.dialogErrorTitle"),
message: this.$i18n.t("uploadDialogMsg.uploadFilesFailed")
});
}); // axios
// .post("/uploadFiles/pc/job/uploadFile", fd, config, {
// timeout: 60000 * 3
// })
// .then(res => {
// if (res.data.status === "success") {
// this.$notify.success({
// title: this.$i18n.t("dialogTitle.dialogSuccessTitle"),
// message: this.$i18n.t("uploadDialogMsg.uploadFilesSuccess")
// });
// }else{
// this.$notify.error({
// title: this.$i18n.t("dialogTitle.dialogErrorTitle"),
// message: this.$i18n.t("uploadDialogMsg.uploadFilesFailed")
// });
// }
// })
// .catch(err => {
// this.$notify.error({
// title: this.$i18n.t("dialogTitle.dialogErrorTitle"),
// message: this.$i18n.t("uploadDialogMsg.uploadFilesFailed")
// });
// });
},
uploadCancle() {
console.log("===Cancle===");
this.$refs.uploadFiles.clearFiles();
}
}
};
</script> <style scoped>
.excel-upload-input {
display: none;
z-index: -9999;
}
.drop {
border: 2px dashed #bbb;
width: 600px;
/* height: 160px; */
line-height: 160px;
margin: 0 auto;
font-size: 24px;
border-radius: 5px;
text-align: center;
color: #bbb;
position: relative;
}
.drop-upload-container {
width: 450px;
}
.item-container {
margin: 0 auto;
/* text-align: center; */
padding-left: 80px;
}
</style>

上传文件调用后台api的封装

import Axios from '@/axios'

export function uploadFilesReq(fd, config) {
return Axios.post("/uploadFiles/pc/job/uploadFile", fd, config, {
timeout: 60000 * 3
});
}

上传文件组件的调用

<template>
<div class="app-container">
<upload
:action="action"
:limit="limitNum"
:accept="accept"
:auto-upload="autoUpload"
/>
</div>
</template> <script>
// import Upload from "@/components/Upload"; import Upload from "./upload"; export default {
name: 'UploadFiles',
components: { Upload },
data() {
return {
action: '/uploadFiles/pc/job/uploadFile',
limitNum: 3,
accept: ".xlsx,.vue,.png,PNG",
autoUpload: false
}
},
methods: { }
}
</script>

2.第二中每个文件都会发送一个请求,并且不能加其他的参数,但是有进度条。

action此时有用的,必须要设置,on-success和on-error这两个钩子函数会起作用

<template>
<el-form>
<div class="drop-upload-container">
<el-form-item :label-width="formLabelWidth">
<el-upload
multiple
drag
ref="uploadFiles"
:action="action"
:limit="limit"
:auto-upload="autoUpload"
:accept="accept"
:before-upload="beforeUploadFile"
:on-remove="handleRemove"
:on-change="fileChange"
:on-exceed="exceedFile"
:on-success="handleSuccess"
:on-error="handleError"
:file-list="fileList"
>
<i class="el-icon-upload"></i>
<div class="el-upload__text">
{{ $t('upload.uploadText') }}
<em>{{ $t('upload.clickUpload') }}</em>
</div>
<div class="el-upload__tip" slot="tip">{{ $t('upload.uploadFileType') }}</div>
</el-upload>
</el-form-item>
<el-form-item class="item-container">
<el-button
size="small"
type="primary"
@click.native="submitUpload"
>{{ $t('buttonTitle.okTitle') }}</el-button>
<el-button size="small" @click.native="uploadCancle">{{ $t('buttonTitle.cancleTitle') }}</el-button>
</el-form-item>
</div>
</el-form>
</template> <script>
import { stringFormat } from "@/utils/stringutils";
import axios from 'axios' export default {
name: "Upload",
props: {
action: {
required: true,
type: String
},
limit: {
required: true,
type: Number
},
autoUpload: {
type: Boolean,
default: false
},
accept: {
required: true,
type: String
}
},
data() {
return {
formLabelWidth: "80px",
userIds: sessionStorage.getItem("userid"),
fileList: [], files: []
};
},
methods: {
// 文件超出个数限制时的钩子
exceedFile(files, fileList) {
let limit_num = `${this.limit}`;
let total_num = `${files.length + fileList.length}`; this.$notify.warning({
title: this.$i18n.t("dialogTitle.dialogWarningTitle"),
message: stringFormat(this.$i18n.t("uploadDialogMsg.uploadFilesLimit"),
[`${this.limit}`, `${files.length + fileList.length}`]
)
});
},
// 文件状态改变时的钩子
fileChange(file, fileList) {
console.log("===change===");
},
// 上传文件之前的钩子, 参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传
beforeUploadFile(file) {
console.log("before upload");
console.log(file);
let extension = file.name.substring(file.name.lastIndexOf(".") + 1);
const isAcceptFiles =
extension === "xlsx" ||
extension === "vue" ||
extension === "png" ||
extension === "PNG";
if (!isAcceptFiles) {
this.$notify.warning({
title: this.$i18n.t("dialogTitle.dialogWarningTitle"),
message: this.$i18n.t("uploadDialogMsg.uploadFilesType")
});
} let size = file.size / 1024 / 1024;
const isAcceptSize = size < 10;
if (!isAcceptSize) {
this.$notify.warning({
title: this.$i18n.t("dialogTitle.dialogWarningTitle"),
message: this.$i18n.t("uploadDialogMsg.uploadFilesSize")
});
}
return isAcceptFiles && isAcceptSize;
},
// 点击x时执行的钩子函数
handleRemove(file, fileList) {
console.log("===remove===");
},
// 文件上传成功时的钩子
handleSuccess() {
this.$notify.success({
title: this.$i18n.t("dialogTitle.dialogSuccessTitle"),
message: this.$i18n.t("uploadDialogMsg.uploadFilesSuccess")
});
},
// 文件上传失败时的钩子
handleError(err, file, fileList) {
this.$notify.error({
title: this.$i18n.t("dialogTitle.dialogErrorTitle"),
message: this.$i18n.t("uploadDialogMsg.uploadFilesFailed")
});
},
handleUpload(raw) {
this.files.push(raw.file);
},
submitUpload() {
console.log(this.form.userIds);
this.$refs.uploadFiles.submit();
},
uploadCancle() {
console.log("=========uploadFile=========");
this.$refs.uploadFiles.clearFiles();
}
}
};
</script> <style scoped>
.excel-upload-input {
display: none;
z-index: -9999;
}
.drop {
border: 2px dashed #bbb;
width: 600px;
/* height: 160px; */
line-height: 160px;
margin: 0 auto;
font-size: 24px;
border-radius: 5px;
text-align: center;
color: #bbb;
position: relative;
}
.drop-upload-container {
width: 450px;
}
.item-container {
margin: 0 auto;
/* text-align: center; */
padding-left: 80px;
}
</style>

el-upload用form的方式多文件上传的方法的更多相关文章

  1. WordPress Contact Form 7插件任意文件上传漏洞

    漏洞名称: WordPress Contact Form 7插件任意文件上传漏洞 CNNVD编号: CNNVD-201311-415 发布时间: 2013-11-28 更新时间: 2013-11-28 ...

  2. IIS7.5修改asp的文件上传限制方法

    第一.IIS7.5修改asp的文件上传限制方法 1.打开IIS 2.打开面板中的应用程序开发 asp 3.找到最后的限制属性 4.修改其中的最大请求实体主体限制的值:默认为200000字节,等于195 ...

  3. ANDROID使用MULTIPARTENTITYBUILDER实现类似FORM表单提交方式的文件上传

    最近在做 Android 端文件上传,要求采用 form 表单的方式提交,项目使用的 afinal 框架有文件上传功能,但是始终无法与php写的服务端对接上,无法上传成功.读源码发现:afinal 使 ...

  4. 使用Anthem.NET 1.5中的FileUpload控件实现Ajax方式的文件上传

    Anthem.NET刚刚发布了其最新的1.5版本,其中很不错的一个新功能就是对文件上传功能的Ajax实现.本文将简要介绍一下该功能的使用方法. Anthem.NET的下载与安装 Anthem.NET可 ...

  5. form+iframe实现ajax文件上传

    在做文件上传时除了传入文件外,还有附件参数,并且要求不刷新页面,之前是表单提交的方式,现在修改成ajax上传的方式,由于没有选择用插件,所以用form+iframe的方式,并且这种方式对IE8以上及主 ...

  6. SpringMVC注解方式与文件上传

    目录: springmvc的注解方式 文件上传(上传图片,并显示) 一.注解 在类前面加上@Controller 表示该类是一个控制器在方法handleRequest 前面加上 @RequestMap ...

  7. php+form表单的文件上传

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. WebApi实现Ajax模拟Multipart/form-data方式多文件上传

    前端页面代码: <input type="file" class="file_control" /><br /> <input t ...

  9. form表单多文件上传

    1.html/jsp主页 <%@ page language="java" contentType="text/html; charset=UTF-8" ...

随机推荐

  1. Docker Explore the application

    https://docs.docker.com/docker-for-mac/#explore-the-application   Open a command-line terminal and t ...

  2. requests库session保持持久会话

      requests中cookie的原理 http://blog.csdn.net/zhu_free/article/details/50563756   requests - cookies的实现例 ...

  3. MySQL高性能学习笔记

    索引 何为索引?有什么作用? 索引是一种用于快速查询和检索数据的数据结构.常见的索引结构有: B 树, B+树和 Hash. 索引的作用就相当于目录的作用.打个比方: 我们在查字典的时候,如果没有目录 ...

  4. ubuntu关机和重启

    本博客旨在自我学习使用,如有任何疑问请及时联系博主 linux下常用的关机命令有:shutdown.halt.poweroff.init:重启命令有:reboot.下面本文就主要介绍一些常用的关机命令 ...

  5. netty系列之:可以自动通知执行结果的Future,有见过吗?

    目录 简介 JDK异步缘起 netty中的Executor Future的困境和netty的实现 总结 简介 在我的心中,JDK有两个经典版本,第一个就是现在大部分公司都在使用的JDK8,这个版本引入 ...

  6. SpringBoot外部配置属性注入

    一.命令行参数配置 Spring Boot可以是基于jar包运行的,打成jar包的程序可以直接通过下面命令运行: java -jar xx.jar 那么就可以通过命令行改变相关配置参数.例如默认tom ...

  7. python-对于一个用例有多个步骤,转换成1条案例的处理方法

    前言 对于前文写到的以excel数据驱动的框架中,每个用例都是单独的不依赖其他的案例,现在一个用例可能会有多个步骤,按照前面写道的博文中按excel表中逐行取出excel的值,那么一条用例有多个步骤, ...

  8. 使用Helm安装harbor

    使用nfs共享存储搭建的pvc(此次都放在一个vpc下): harbor使用nodePort方式部署,不使用ssl: 准备工作: 准备好harbor用的pvc: 安装好helm,添加好可用源: 因为使 ...

  9. 【C# .Net GC】手动监视和控制对象的生命周期(GCHandle)

    这个话题还未做详细研究,暂时用不到,只是粗略看了一下. 使用System.Runtime.InteropServices.GCHandle类来手动控制对象的生命周期 (个人感觉这里可能有一些问题... ...

  10. windows 常用的shell(cmd.exe)命令大全

    Windows常用shell命令大全(转) [Windows常用shell命令大全] 基于鼠标操作的后果就是OS界面外观发生改变, 就得多花学习成本.更主要的是基于界面引导Path与命令行直达速度是难 ...