vue中上传文件相同文件问题

本文介绍在Vue项目中实现文件上传的方法,包括使用FormData模拟表单文件提交,解决上传同名文件不触发change事件的问题。

vue项目中会遇到上传文件的需求,jquery会有一些插件很方便,如果不使用插件网上的方法没有太容易的而且很多是原生JS或者基于jQuery操作dom结构的。那么在vue项目中如何实现呢,还有如何模拟表单文件提交呢?
这里文件上传文件框的样式美化就不过多赘述了,有很多例子。只介绍一下功能的实现以及注意的问题。

<template>
  <div>

<span><a href="javascript:;" class="file_prev">本地上传</a><input type="file" class="preFile" name="staffFile" multiple="multiple" @change="changeFn($event)" v-if="clearShow"></span>

  </div>
</template>

其中,multiple=”multiple”代表文件可多选

给文件选择器绑定change事件让它在上传文件后去执行methods里的函数,@change=”changeFn($event)”

changeFn(e){
        this.deviceArray = [];
        let deviceFile = e.target.files;
        let formData = new FormData();
        for(let i=0;i<deviceFile.length;i++){
          formData.append('file', deviceFile[i]);
        }
        this.clearShow = false;
        let config = {
          headers: {
            'Content-Type': 'multipart/form-data'
          }
        }
        this.$axios.post(this.$API.processManage.processAddCheck,
          formData, config
        ).then((res)=>{
          console.log(res);
          this.clearShow = true;
        },()=>{
            this.clearShow = true;
        });
      },

使用FormData()模拟表单提交文件,循环e.target.files的文件添加到FormData()中。

表单上传请求头信息headers: {‘Content-Type’: ‘multipart/form-data’},

再使用axios配合发送请求这样上传文件功能就基本实现了。
但是其中遇到一个问题就是change事件触发条件是文件上传框内容改变才可以,每次上传完文件默认是不清空上一次上传的内容的,这样上传同名文件就不会触发change事件。

网上现有的方法就是重置input上传文件的标签的dom结构,在vue里我的实现方法就是v-if去控制。

v-if=”clearShow”,初始化数据为true,在change事件触发的函数里设置clearShow为false,即移除了该input标签,然后在回调函数中再设置clearShow为true,这时的文件上传框就是清空的了。再上传同名文件也不会受影响了。

### Vue 中实现文件上传的方法与代码示例 在 Vue 中实现文件上传功能可以通过多种方式完成,常见的有使用原生的 `FormData` 对象以及借助第三方库(如 Axios)。以下是详细的实现方法和代码示例: #### 1. 使用 `FormData` 实现文件上传 通过 HTML 的 `<input>` 元素获取用户选择的文件,并将其封装到 `FormData` 对象中发送到服务器。这种方式简单直观,适用于大多数场景。 ```html <template> <div> <!-- 文件输入框 --> <input type="file" @change="handleFileChange" /> <!-- 上按钮 --> <button @click="uploadFile">上</button> </div> </template> <script> import axios from 'axios'; export default { data() { return { file: null, // 存储选中的文件 }; }, methods: { handleFileChange(event) { this.file = event.target.files[0]; }, async uploadFile() { if (!this.file) { alert('请选择一个文件'); return; } const formData = new FormData(); formData.append('file', this.file); try { const response = await axios.post( 'http://localhost:8080/upload', formData, { headers: { 'Content-Type': 'multipart/form-data', // 设置 Content-Type }, } ); console.log('文件上传成功:', response.data); } catch (error) { console.error('文件上传失败:', error); } }, }, }; </script> ``` 此代码片段展示了如何通过前端捕获用户的文件选择并将该文件以表单数据的形式提交给后端服务[^1]。 #### 2. 封装文件上传请求方法 对于更复杂的应用程序,可能需要多次重复相同文件上传逻辑。此时可以将文件上传逻辑抽象出来形成独立的服务函数供其他组件调用。 ```javascript // utils/request.js import axios from 'axios'; /** * 上文件接口封装 * * @param {string} url - 后端接收文件的 URL 地址 * @param {*} data - 要上的数据(通常是 FormData) * @returns Promise<any> 返回响应结果 */ export function uploadFile({ url, data }) { return axios.post(url, data, { headers: { 'Content-Type': 'multipart/form-data', // 确保设置 multipart 表单类型 }, }); } ``` 这样做的好处是可以集中管理所有的 HTTP 请求配置,减少冗余代码的同时也便于后续维护更新[^2]。 #### 3. Vant UI 组件库实现文件上传 如果项目已经集成了 Vant 这样的移动端 UI 框架,则可以直接利用其内置的 `van-uploader` 组件简化文件上传的操作流程。 ```html <template> <div class="uploader-box"> <!-- 文件上传区域 --> <van-uploader v-model="fileList" :after-read="afterRead" multiple> <van-icon name="plus" /> 添文件 </van-uploader> </div> </template> <script> import { Toast } from 'vant'; import { uploadFile } from '@/utils/request'; export default { data() { return { fileList: [], // 已上文件列表 }; }, methods: { afterRead(file) { // 此处触发文件读取完成后的行为 const formData = new FormData(); formData.append('file', file.file); uploadFile({ url: 'http://localhost:8080/upload', data: formData, }) .then((res) => { Toast.success('上成功!'); this.fileList.push(res); // 更新状态 }) .catch((err) => { Toast.fail('上失败,请稍后再试...'); }); }, }, }; </script> ``` 这段例子结合了 Vant 提供的视觉控件优势,使得整个用户体验更友好流畅[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值