Vue使用el-upload上传JSON,TXT文件解析后进行传递

这篇文章介绍了如何使用Element UI实现阶段原因的文件上传功能,通过FileReader解析JSON并调用HTTP API更新原因,展示了前端与后端交互的基本步骤。
<template>
  <div>
    <el-upload
      action
      :on-change="updateReason"
      :auto-upload="false"
      accept=".json"
      list-type="multipart/form-data"
    >
      <el-button size="small" type="primary">阶段原因上传</el-button>
      <div slot="tip" class="el-upload__tip">只能上传JSON文件</div>
    </el-upload>
  </div>
</template>
<script>
import http from '../../lib/http' //(封装的axios)
export default {
  data() {
    return {
      fileList: [],
    }
  },
  methods: {
    updateReason(file, fileList) {
      this.fileTransmit(file, fileList)
    },
    fileTransmit(file, fileList, isShow) {
      this.fileList = fileList
      var reader = new FileReader() //新建一个FileReader
      reader.readAsText(file.raw, 'UTF-8') //读取文件
      reader.onload = async function(evt) { //读取文件完毕执行此函数
        let dataJson = JSON.parse(evt.target.result)
        let apiUrl = 'http://11.2.180.225:3003/searchplat/sample/user/updateReason'

        let { data } = await http.post(apiUrl, { json: dataJson })
        console.log(data)
      }
    },
  },
}
</script>

<think>我们面对的问题:Vue3中使用el-upload上传txt文件时出现415错误。 415错误表示“Unsupported Media Type”,即服务器无法处理请求附带的媒体格式。 分析可能的原因: 1. 前端上传时,请求头中的Content-Type不正确,或者服务器不支持该Content-Type。 2. 后端接口期望的Content-Type与实际发送的不匹配。 根据引用[1]和引用[3]中的代码,我们可以参考: 引用[1]中使用el-upload的默认行为,没有特别设置请求头。 引用[3]中则通过自定义上传函数设置了请求头:'Content-Type': 'multipart/form-data'。 通常,文件上传应该使用multipart/form-data格式。但是,如果服务器要求其他类型(比如application/json)或者对文件类型有特殊要求,就可能出现415错误。 另外,上传txt文件时,如果服务器端没有正确配置接受文本文件,也可能导致该错误。 解决方案步骤: 1. 确认服务器接口支持的Content-Type。 通常,文件上传接口应该支持multipart/form-data。但需要确认后端接口是否支持。 2. 检查前端上传请求的Content-Type。 在el-upload中,默认情况下,当我们使用action属性并且不设置http-request覆盖默认上传时,它会自动设置multipart/form-data。但是,如果我们使用自定义上传(如引用[3]),则需要显式设置。 3. 检查自定义上传函数的请求头设置(如果使用了自定义上传)。 参考引用[3],在自定义上传函数中,我们设置了: headers: { 'Content-Type': 'multipart/form-data', ignoreCancelToken: true, } 4. 检查上传文件类型和文件名后缀。 虽然我们上传的是txt文件,但注意el-upload组件的accept属性(引用[1]中设置为.accept=".gltf,.glb")限制了选择文件的类型。如果我们没有设置accept或者设置为.txt,则没有问题。但如果我们设置了其他类型,而用户选择的是txt,则可能被拒绝。 5. 确保服务器端支持txt文件类型。 后端可能配置了只接受某些类型的文件(如只接受图片),那么上传txt就会导致415。 具体到我们的问题,我们上传的是txt文件,所以我们需要: - 确保el-upload的accept属性包含“.txt”,或者不设置(允许所有)。 - 确保后端接口能够接收txt文件(即支持multipart/form-data,并且没有限制文件类型为图片等)。 如果使用了自定义上传,请参考引用[3]的代码,设置正确的Content-Type。 如果问题仍然存在,我们可以尝试以下步骤: 6. 使用自定义上传函数,以便更灵活地控制请求。 我们可以覆盖el-upload的http-request,然后使用类似引用[3]中的方法,手动构造FormData并发送请求。 7. 在自定义上传函数中,确保正确设置了Content-Type为multipart/form-data,并且不要显式设置boundary(因为浏览器会自动设置,手动设置boundary有时会导致问题)。 8. 使用浏览器开发者工具查看实际发送的请求头,确认Content-Type是否正确,以及请求体是否符合要求。 9. 与后端开发人员确认接口要求,确保接口确实支持multipart/form-data,以及支持txt文件类型。 代码示例(自定义上传): 我们可以仿照引用[3]中的代码,编写一个自定义上传函数。同时,注意在el-upload中设置:http-request="customUpload"。 模板部分: <el-upload action="#" // 如果使用自定义上传,action可以设置为#或者不设置,但一般要保留(因为el-upload要求) :http-request="customUpload" ...其他属性 > ... </el-upload> 脚本部分: const customUpload = async (options) => { const { file } = options; const formData = new FormData(); formData.append('file', file); // 字段名根据后端要求,可能是'file'或者其他,例如引用[1]中的name="sourcefile",那么这里应该是'sourcefile' // 如果有额外参数,也可以添加 // formData.append('key', value); try { const response = await request({ url: `${baseUrl}/your-upload-path`, // 上传地址 method: 'post', data: formData, headers: { 'Content-Type': 'multipart/form-data', // 设置Content-Type // 其他需要的头,比如token等 }, // 如果引用[3]中的进度条功能,可以加入onUploadProgress onUploadProgress: (progressEvent) => { // 计算进度 const percent = Math.round((progressEvent.loaded / progressEvent.total) * 100); // 调用el-upload的onProgress事件(如果有需要) options.onProgress({ percent }); } }); // 上传成功 options.onSuccess(response); } catch (error) { options.onError(error); } }; 注意:在自定义上传中,我们完全控制了请求的发送,因此可以根据后端要求调整。 另外,如果后端接口除了文件还需要传递其他参数,我们可以通过formData.append添加。 10. 如果后端要求将文件作为二进制流上传(而不是multipart/form-data),那么我们需要改变上传方式。 不过这种情况较少,一般文件上传都是multipart/form-data。如果后端要求是二进制流,则: headers: { 'Content-Type': 'application/octet-stream', // 或者具体的文本类型 'text/plain' } 并且,我们不需要使用FormData,而是直接将文件内容作为请求体发送。 但是,注意el-upload默认不支持这种方式,必须使用自定义上传,并且在自定义上传中读取文件内容然后发送。 不过,415错误更常见的原因是服务器不支持我们发送的Content-Type。所以重点还是检查前后端Content-Type是否匹配。 总结步骤: 1. 检查服务器支持的Content-Type,确保前端发送的Content-Type在支持列表中。 2. 确保前端发送请求的Content-Type正确(通常为multipart/form-data)。 3. 检查文件类型是否被服务器接受(txt类型是否在允许的范围内)。 4. 使用自定义上传函数,确保请求构造正确。 如果确认以上几点,应该就能解决415错误。 相关问题: 1. 如何查看el-upload组件实际发送的请求? 2.Vue3中,如何正确使用el-upload的自定义上传(http-request)? 3. 后端如何配置以支持multipart/form-data文件上传? 4. 上传文件时,如何添加额外的参数(如项目ID、用户ID等)? </think>### Vue3使用el-upload上传txt文件出现415错误的解决方案 415错误表示**不支持的媒体类型**(Unsupported Media Type),通常由以下原因导致: #### 根本原因分析 1. **Content-Type不匹配**:服务器要求特定Content-Type(如`multipart/form-data`),但实际请求头未正确设置[^1][^3] 2. **文件类型限制**:后端接口未配置支持`.txt`文件类型 3. **请求格式错误**:未使用FormData封装文件数据[^3] --- ### 解决方案(分步骤) #### 1. 确保请求头正确设置 在自定义上传函数中**显式声明Content-Type**: ```javascript headers: { 'Content-Type': 'multipart/form-data' // 必须明确设置[^3] } ``` #### 2. 使用FormData封装文件 参考引用[3],正确封装文件数据: ```javascript const formData = new FormData(); formData.append('file', file.raw); // 'file'需与后端字段名匹配 // 若有额外参数 formData.append('projectId', userStore.projectid); ``` #### 3. 检查后端接口配置 确保后端支持: - 媒体类型:`multipart/form-data` - 文件类型:添加`.txt`到白名单 - 请求体解析:如Spring Boot需`@RequestParam("file") MultipartFile` #### 4. 前端完整代码示例 ```vue <template> <el-upload :auto-upload="false" :on-change="handleFileChange" accept=".txt" > <el-button>上传TXT文件</el-button> </el-upload> </template> <script setup> import { request } from '@/utils/request'; // 自定义请求库 const handleFileChange = async (file) => { const formData = new FormData(); formData.append('sourcefile', file.raw); // 字段名与后端一致 try { const res = await request({ url: '/api/upload', method: 'POST', data: formData, headers: { 'Content-Type': 'multipart/form-data' // 关键设置[^3] } }); console.log('上传成功', res); } catch (err) { console.error('415错误', err); } }; </script> ``` #### 5. 调试建议 - 使用Postman测试接口:验证后端是否支持txt上传 - 浏览器开发者工具:检查Network标签中的 - 实际请求头`Content-Type` - 请求体FormData格式 - 临时注释后端文件类型验证进行测试 > **关键点**:415错误本质是前后端媒体类型协商失败,重点检查请求头的`Content-Type`与后端支持的类型是否匹配[^1][^3]。 --- ### 相关问题 1. 如何查看el-upload实际发送的请求头? 2. Spring Boot后端应该如何配置multipart文件上传? 3. 遇到413 Request Entity Too Large错误该如何解决? 4. el-upload如何实现多文件同时上传? 5. 前端如何显示txt文件上传进度条?[^3]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值