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 中使用的字段名相匹配。
相关推荐
Jerry2 分钟前
Jetpack Compose 中的状态
前端
dae bal1 小时前
关于RSA和AES加密
前端·vue.js
柳杉1 小时前
使用three.js搭建3d隧道监测-2
前端·javascript·数据可视化
lynn8570_blog1 小时前
低端设备加载webp ANR
前端·算法
LKAI.1 小时前
传统方式部署(RuoYi-Cloud)微服务
java·linux·前端·后端·微服务·node.js·ruoyi
刺客-Andy2 小时前
React 第七十节 Router中matchRoutes的使用详解及注意事项
前端·javascript·react.js
前端工作日常2 小时前
我对eslint的进一步学习
前端·eslint
禁止摆烂_才浅3 小时前
VsCode 概览尺、装订线、代码块高亮设置
前端·visual studio code
程序员猫哥3 小时前
vue跳转页面的几种方法(推荐)
前端
代码老y4 小时前
十年回望:Vue 与 React 的设计哲学、演进轨迹与生态博弈
前端·vue.js·react.js