今天做毕业设计的时候遇到了一个上传用户图像的问题,头大了半天也没有解决,最后还是请教了佳鑫,就记录一下,也权当是笔记。

首先我们把 elment-plus 的组件给复制下来
<template>
  <el-upload
    class="avatar-uploader"
    action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
    :show-file-list="false"
    :on-success="handleAvatarSuccess"
    :before-upload="beforeAvatarUpload"
  >
    <img v-if="imageUrl" :src="imageUrl" class="avatar" />
    <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
  </el-upload>
</template>

<script lang="ts" setup>
import { ref } from 'vue'
import { ElMessage } from 'element-plus'
import { Plus } from '@element-plus/icons-vue'

import type { UploadProps } from 'element-plus'

const imageUrl = ref('')

const handleAvatarSuccess: UploadProps['onSuccess'] = (
  response,
  uploadFile
) => {
  imageUrl.value = URL.createObjectURL(uploadFile.raw!)
}

const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => {
  if (rawFile.type !== 'image/jpeg') {
    ElMessage.error('Avatar picture must be JPG format!')
    return false
  } else if (rawFile.size / 1024 / 1024 > 2) {
    ElMessage.error('Avatar picture size can not exceed 2MB!')
    return false
  }
  return true
}
</script>

<style scoped>
.avatar-uploader .avatar {
  width: 178px;
  height: 178px;
  display: block;
}
</style>

<style>
.avatar-uploader .el-upload {
  border: 1px dashed var(--el-border-color);
  border-radius: 6px;
  cursor: pointer;
  position: relative;
  overflow: hidden;
  transition: var(--el-transition-duration-fast);
}

.avatar-uploader .el-upload:hover {
  border-color: var(--el-color-primary);
}

.el-icon.avatar-uploader-icon {
  font-size: 28px;
  color: #8c939d;
  width: 178px;
  height: 178px;
  text-align: center;
}
</style>

其中核心代码块是这些

<el-upload
    class="avatar-uploader"
    action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
    :show-file-list="false"
    :on-success="handleAvatarSuccess"
    :before-upload="beforeAvatarUpload"
  >
    <img v-if="imageUrl" :src="imageUrl" class="avatar" />
    <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
  </el-upload>
首先:我遇见的情况是这样一种情况:

后端代码的请求参数长这个样子:
在这里插入图片描述
这就意味着我前端要向后端发送一个参数: 名字叫做“multipartFile” 参数类型是 MultipartFile类型的,那么MultipartFile类又是什么呢?

MultipartFile是SpringMVC提供简化文件流操作的接口,我们先不用管其他,只需要先记住MultipartFile是操作 文件流的就可以

那么我们前端该怎么调接口呢(参数该怎么携带呢?)

  • 我们忽然想到H5新增的一个js类型,FormData,用于将数据封装成“键-值”形式,以便用于发送HTTP请求,在创建FormData对象时,可以利用JS的Blob对象来封装文件流数据:
  • FormData 接口提供了一种表示表单数据的键值对 key/value 的构造方式,并且可以轻松的将数据通过XMLHttpRequest.send() 方法发送出去,本接口和此方法都相当简单直接。如果表单 enctype 属性设为 multipart/form-data ,则会使用表单的 submit() 方法来发送数据,从而发送数据具有同样形式。
    了解了这些:

我们再去看elment-plus 的 action属性,似乎没有办法传递任何参数(除非用get请求,将参数放到网址后面),但是和后端定义的接口也不一样了
于是我们选取了一个折中的方法 ,使用了一个:http-request,
官方时这样解释的:
http-request:覆盖默认的 Xhr 行为,允许自行实现上传文件的请求。
所以我们就能在自定义方法中传递参数了,代码如下。

<el-upload
      class="avatar-uploader"
      action="#"
      :show-file-list="false"
      :on-success="handleAvatarSuccess"
      :before-upload="beforeAvatarUpload"
      :http-request="upload"
  >

// js 代码
const upload = (params:any)=>{
  //FormData是HTML5新增的js类型,用于将数据封装成"键-值"形式,
  // 以便用于发送HTTP请求。在创建FormData对象时,可以利用JS的Blob对象来封装文件流数据:
  let formData=new FormData();
  formData.append('multipartFile',params.file);
  axios.post('http://localhost:9001/sms/system/headerImgUpload', formData);
}

成功上传代码。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐