Vue3上传图片报错:Current request is not a multipart request

当你看到错误 "Current request is not a multipart request" 时,这通常意味着你的服务器或后端代码期望接收一个 multipart/form-data 类型的请求,但实际上并没有收到这样的请求。在使用 <el-upload> 组件时,如果你已经设置了 http-request 属性来自定义上传行为,并且遇到了这个错误,可能是因为你在发送请求时没有正确地设置请求的内容类型为 multipart/form-data,或者你的自定义上传函数没有正确处理文件数据。

在 Vue.js 和 Element UI 的上下文中,如果你使用 http-request 来自定义上传,你需要确保以下几点:

  1. 请求类型 :确保你的请求是以 multipart/form-data 的形式发送的。这通常意味着你需要使用 FormData 对象来构建你的请求体。

  2. FormData :在 http-request 方法中,使用 FormData 对象来添加文件和其他可能需要的字段。

  3. 请求头 :虽然你通常不需要手动设置 Content-Typemultipart/form-data(因为浏览器会在你使用 FormData 时自动设置),但你需要确保其他必要的请求头(如认证令牌)被正确添加。

  4. 发送请求 :使用适合发送 multipart/form-data 请求的 HTTP 客户端(如 axios、fetch API 或 XMLHttpRequest)来发送你的请求。

下面是一个使用 http-request 和 FormData 的示例,它应该可以帮助你解决问题:

javascript 复制代码
<template>  
  <el-upload  
    class="upload-demo"  
    :http-request="customUpload"  
    list-type="picture-card"  
    :on-preview="handlePreview"  
    :on-remove="handleRemove"  
    :file-list="fileList"  
    multiple  
  >  
    <i class="el-icon-plus"></i>  
  </el-upload>  
</template>  
  
<script>  
export default {  
  data() {  
    return {  
      fileList: [],  
    };  
  },  
  methods: {  
    customUpload(file) {  
      let formData = new FormData();  
      formData.append('file', file.raw); // 注意:这里使用 file.raw 取决于你的 file 对象结构,通常可能是 file  
  
      // 添加其他可能需要的字段  
      // formData.append('otherField', 'someValue');  
  
      // 使用 axios 发送请求(假设你已经安装了 axios)  
      axios.post('你的上传URL', formData, {  
        headers: {  
          'Authorization': 'Bearer 你的令牌',  
          // 注意:通常不需要手动设置 'Content-Type',因为 axios 会自动处理  
        },  
        onUploadProgress: progressEvent => {  
          // 处理上传进度(可选)  
        },  
      })  
      .then(response => {  
        // 处理上传成功的逻辑  
        // 例如,更新 fileList 或显示成功消息  
      })  
      .catch(error => {  
        // 处理上传失败的逻辑  
        // 例如,显示错误消息  
      });  
    },  
    handlePreview(file) {  
      console.log('preview', file);  
    },  
    handleRemove(file, fileList) {  
      console.log('remove', file, fileList);  
    },  
  },  
};  
</script>

注意

  • 在上面的示例中,我使用了 file.raw 来获取原始文件对象。然而,在 Element UI 的 <el-upload> 组件中,通常你只需要传递 file 对象(它本身就是一个 File 对象),除非你的 file 对象被以某种方式修改或封装了。
  • 如果你在使用 Element UI 的 file-list 属性并希望更新它,你可能需要在上传成功或失败时手动修改 fileList 数组。
  • 确保你的后端服务器能够处理 multipart/form-data 类型的请求,并且期望的字段名(在这个例子中是 'file')与你在 FormData 中使用的字段名相匹配。
相关推荐
小雪_Snow8 小时前
JS 数组的遍历 —— 两种方式详解
前端·javascript
尽兴-8 小时前
传统 Java/Vue 系统如何一步步接入 AI 维护
java·vue.js·人工智能·ai·大模型
禅思院8 小时前
AI对话前端从入门到崩溃:一个长对话引发的五层优化战争【五】
前端·架构·前端框架
kyle~8 小时前
前端---Zustand组件库(轻量快速精细化的状态管理方案)
前端
IT_陈寒8 小时前
为什么我的React状态更新总是不按套路出牌?
前端·人工智能·后端
张人玉8 小时前
基于Vue 3 + ECharts / ECharts-GL / echarts-wordcloud 的数据可视化大屏——地形与产业数据可视化大屏
vue.js·信息可视化·echarts
恋猫de小郭8 小时前
Fluter 共享内存多线程正在落地,IsolateGroupBound 来了
android·前端·flutter
十铭忘9 小时前
Vue3实现Pixso中的钢笔工具3——梳理函数调用
前端·vue.js
逝水无殇9 小时前
HTML 元素详解
开发语言·前端·html
糖墨夕9 小时前
AI Agent技术栈选择:Vue3 + NestJS + TypeScript 为什么是绝佳组合
前端·nestjs