解决input type=file 同一个文件二次上传无效的问题

在做上传文件的时候,大家会引入input标签。但在实现的过程中,在上传一个文件后,第二次上传同一个文件时会无法触发上传的代码,问题其实这样解决。

<input type="file" ref="referenceUpload" @change="onUpload" style="width: 78px;outline: none;height: 30px;z-index: 999;opacity: 0;"></Input>
<Button type="primary" style="margin: 0px 0px 0px -83px;">上传文件</Button>

 

//上传PDF文件
			onUpload(e) {				
				var formData = new FormData();
				formData.append('file', e.target.files[0]);
				formData.append('token', localStorage['token']);
				this.loadingst();
				this.axios.post('/report/upload', formData, {
					emulateJSON: true
				}).then(function(res) {					
					this.loadingsts();
					if(res.data.code == 200) {
						this.file_path = res.data.data.save_path;
						this.fromValue.report_name = res.data.data.name;
						this.file_name = res.data.data.name + '.pdf';
						this.file_size = res.data.data.size;
						this.file_size_name = ' | ' + res.data.data.size;
						this.$Notice.success({
							title: '提示',
							desc: '上传成功 !',
							duration: 3
						})
						
					} else {
						this.$Notice.warning({
							title: res.data.msg,
							duration: 3
						});
					}
				}.bind(this))
				e.target.value = '';
			},

 

关键句

实现功能的关键在于最后一句:

e.target.value='';

因为触发条件为change,当input里储存的文件没有变化的时候是不会进入函数的,所以在上传的最后,把input中的value值清空就好了。

 

问题发生背景
使用input[type=file] 实现文件上传功能,通过onchange事件触发js代码,这个时候第一次上传是完全没问题的,不过当你第二次上传文件时,如果是不同于上一次上传文件的话是可以正常上传的,不过如果你选择的还是上一个文件,也就是两次上传的文件重复了,那么就会上传失败。

原因
input是通过onchange事件来触发js代码的,由于两次文件是重复的,所以这个时候onchange事件是没有触发到的。

解决方案
方案一: 删除input标签的代码并重新添加dom节点,不过这个方案太笨拙,所以使用方案二。
方案二: 把input的value重新设置为空就好了,

document.getElementById('uploadFile').value = null;

this.$refs.referenceUpload.value = null;(vue中)

转载于:https://my.oschina.net/u/3946362/blog/3081631

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用以下代码实现 jQuery 动态添加 input type=file 文件上传域并配合 ajax 上传文件。 HTML 代码: ```html <div id="file-list"></div> <button id="add-file">添加文件</button> ``` JavaScript 代码: ```javascript $(function() { var fileList = $('#file-list'); var addButton = $('#add-file'); addButton.on('click', function() { var fileInput = $('<input type="file" name="file">'); var removeButton = $('<button>删除</button>'); var listItem = $('<div></div>').append(fileInput).append(removeButton); fileList.append(listItem); removeButton.on('click', function() { listItem.remove(); }); fileInput.on('change', function() { var file = fileInput[0].files[0]; if (file) { var formData = new FormData(); formData.append('file', file); $.ajax({ url: '/upload', type: 'POST', data: formData, processData: false, contentType: false, success: function(data) { console.log('上传成功'); } }); } }); }); }); ``` 具体实现步骤如下: 1. 创建一个包含文件列表的容器和添加文件按钮。 2. 给添加文件按钮绑定一个点击事件,动态创建一个 input type=file 文件上传域和删除按钮,将它们添加到文件列表容器中。 3. 给删除按钮绑定一个点击事件,当点击时将该文件上传域从文件列表容器中删除。 4. 给文件上传域绑定一个 change 事件,当选择了文件时,创建一个 FormData 对象,将选中的文件添加到其中,然后通过 ajax 发送到服务器。 5. 在 ajax 的 success 回调函数中处理上传成功后的逻辑。 注意,要设置 processData 和 contentType 为 false,这样 jQuery 就会将 FormData 对象中的数据直接发送到服务器,而不是将其转换为字符串发送。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值