vue java 上传图片,vue+element 文件上传

一、前言

element ui 已经提供了文件上传的组件,直接拿来就能用。具有以下几个特点:

限制文件上传的个数,多个文件会发起多个请求。

可以设置文件选择后自动上传或者手动触发上传,并且手动触发可以自定义上传逻辑。

可以限制文件格式和大小,比如:jpeg等之类的。

设置缩略图模板。

控制文件列表

二、代码及注意事项

ref="upload"

action="" // 注意点一

:multiple="false"

:auto-upload="false" //注意点二

:limit="2" //注意点三

accept=".csv" //注意点四

:on-change="handleChange"

:before-upload="beforeUpload"

:http-request="submitFile" //注意点五

:file-list="fileList"

:on-exceed="onExceed" //注意点六

>

选取文件

只能上传csv文件

style="margin-left: 10px;"

type="success"

@click="selectFile" //注意点七

>提 交

关于el-upload 组件提醒以下几点点:

注意点一    action=""

此属性必填,值为上传路径url。

注意点二::auto-upload="false"

表明手动触发上传文件的行为,当 点击选择文件只是选择文件,当点击 提交 按钮时 才会真正的上传。

注意点三: :limit=2“”

限制文件上传个数为2

注意点四:accept=".csv"

当你选择文件时,默认在弹出框中过滤只显示.csv文件,当然你可以手动切换过滤的格式,仍然可以选择其他文件,

所以这种方法不能严格保证上传格式符合要求,需要在上传的时候再次校验。

注意点五::http-request="submitFile"

此属性只有在:auto-upload="false" 才会生效,表示手动触发时将会覆盖默认上传的逻辑,

同时action="url"也会失效。所以,你可以在 submitFile 方法里实现一些业务逻辑。比如,根据不同的参数选择不同的url上传。

注意点六::on-exceed="onExceed"

超过限制的文件数量时,回调的方法,可以给出提示。

三、问题及经验

下面说说我遇到的问题

1. 如何实现手动触发文件上传。

前面已经说了几个关键点:http-request,auto-upload, action

如果 :auto-upload=“false” 就是手动触发,进一步,如果 :http-request="submitFile" ,那么提交时将会覆盖默认的上传行为,走submitFile方法逻辑。贴下我的代码:

selectFile() {

if (this.fileObj == null) {

this.$message.error('请选择文件')

}

this.$refs.upload.submit()

console.log('发送文件..')

},

其中,this.$refs.upload.submit() 便会去调用自定义的submitFile方法。 注意哦,selectFile是 提交 按钮的事件。那真正的请求逻辑是submitFile,此时action=“url”也将失效。我采用了表单提交的方式,并且不同根据不同的参数,调用不同的url。

submitFile(item) {

this.fileObj = item.file

const formData = new FormData()

formData.append('file', this.fileObj)

if (this.type === 'USER') {

importUser(this.$store.state.user.id, formData)

}

if (this.type === 'ORG') {

importOrg(this.$store.state.user.id, formData)

}

},

2. 严格限制上传文件的格式:

前面说过可以用accept 属性,但是不能够严格保证,只是在文件选择时候根据文件后缀名进行过滤而已。所以,上传之前需要校验,在before-upload回调方法里进行逻辑处理:

beforeUpload(file) {

const iscsv = file.type === 'application/vnd.ms-excel'

if (!iscsv) {

this.$message.error('只支持csv格式的文件!')

}

return iscsv

},

那我怎么知道文件类型是什么??可以通过方法里面的file参数知道关于此文件的所有信息。此方法返回false,将不会上传,并丢弃此文件。

3. 只能上传一个文件,并且再次选择时候覆盖第一个文件。

limit="1" 可以限制只能上传一个文件,当再次选择文件时,将会触发 on-exceed 回调方法(如果你绑定了此方法),然后就结束后续操作了。不能满足需求。

实现方案1:

在on-exceed方法里提示用户,让用户先删除原来的文件列表,然后就可以再次上传新文件了。

onExceed(file, fileList) {

this.$message.error('只能上传一个文件,请先删除已有文件!')

},

第一个file参数,是当前选中的文件,第二个参数fileList为已经选中的文件列表。

实现方案二:

在用户选择时,默认删除第一个文件,这样无论上传多少个文件,都只会保留最后一次选择的文件。关键点:绑定handle-change 事件,将fileList中的第一个文件删除。代码如下:

handleChange(file, fileList) {

if (fileList.length > 1) {

this.$refs.upload.handleRemove(fileList[0])

}

console.log(fileList)

},

当采用这种方案时,页面上会有出现文件删除和增加的动画效果,个人觉得不是很好,因此,需要除去此效果,网上找寻一波,以下方法经受住了我的考验,和大家分享下:

/deep/ .el-list-enter-active,

/deep/ .el-list-leave-active {

transition: none;

}

/deep/ .el-list-enter,

/deep/ .el-list-leave-active {

opacity: 0;

}

以上便是在使用el-upload组件上传时的使用方法和心得,建议一定要好好阅读官方文档的实例,基本都能满足我们的需求。写的不详细的地方,一定要去看官网哦,文档都写了,睁大眼睛,传送带: https://element.eleme.cn/#/zh-CN/component/upload

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值