van-uploader上传图片

文章描述了一个使用Vue.js的van-field和van-uploader组件实现的单张人脸图片上传功能,包括删除图片、文件大小限制、上传前验证、上传后处理等步骤,并且在上传完成后提交表单至后台接口。

一、单张人脸图片上传

deletable 是否显示删除按钮,默认false

:max-count="1" 最大上传图片张数

v-model="uploader"  uploader列表类型,组件默认显示的图片

uploader 组件默认显示图片的数组,有具体格式[{url:"xxxxx图片地址" }]

:max-size="5 * 1024 * 1024" 文件大小限制

@oversize="onOversize"  限制文件上传函数 超过最大max-size 的时候

:before-read="beforeRead" 上传图片前

:after-read="afterRead" 上传图片后

:before-delete="delImg" 删除图片时

   <van-form ref="forms">
      <!-- 人脸信息 -->
      <van-field
        name="test"
        label="人脸信息"
        :rules="[{ required: true, message: '请上传人脸信息' }]"
      >
        <template #input>
          <van-uploader
            :deletable="!detail"
            :max-count="1"
            v-model="uploader"
            :max-size="5 * 1024 * 1024"
            @oversize="onOversize"
            :before-read="beforeRead"
            :after-read="afterRead"
            :before-delete="delImg"
          />
        </template>
      </van-field>
      <!-- 表单提交按钮,flag属性 在上传图片时禁用按钮,图片上传成功解除禁用 -->
       <van-button
          round
          block
          :disabled="flag"
          type="info"
          native-type="submit"
          @click="subForm()"
          >提交</van-button
        >     
    </van-form>


import { uploadImg } from "@/api/xxx/xxx/upload"; // 到入图片上传接口


  data() {
    return {
      flag: false, // 上传时候禁用上传按钮
      form: {
        faceImg: [], //实际要传的 接口转换后的 图片数据
      },
      uploader: [], // 组件默认显示图片信息
    };
  },

函数方法:

methods:{
    // 获取详情信息
      getDetail(id).then((res) => {
        if (res.code == 200) {
          // 默认显示人脸数据 格式:uploader[{url:'xxxx图片地址'}]
          const imgObj = {};
          imgObj.url = this.GLOBAL.imgUrl + res.data.faceImg;
          // this.form.faceImg 获取详情时候是空 赋值
          this.form.faceImg.push(imgObj);
          // 赋值默认显示图片列表
          this.uploader = this.form.faceImg;
          // console.log("###form", this.form);
          if (this.form.状态字段== "2") {
            this.detail = false; // 切换成详情
          } else {
            this.detail = true; // 切换成详情
          }
        }
      });
    // -----------------------------------------------------------------------
    // 上传图片文件
    // 传一个照片 获取一次uploadImg接口,把file.file文件做参数,要formData类型保存
    // 把后端传的数据保存
    afterRead(file) {
      this.flag = true;
      file.status = "uploading";
      file.message = "上传中...";
      let formData = new FormData(); // 上传图片要formData类型
      // "uploadImage" 这个字段要看后端需要并进行定义
      formData.append("uploadImage", file.file); 
      uploadImg(formData).then((response) => {
        if (response.code == 200) {
          file.status = "done";
          file.message = "上传完成";
          this.flag = false;
          this.form.faceImg.push(response.msg); // 实际提交表单需要传的 接口转换后 图片数据
          this.form.faceImg = this.form.faceImg[0]; // 因为只有一张,直接传1个字符串
        } else {
          file.status = "failed";
          file.message = "上传失败";
        }
      });
    },
    // 上传图片前返回布尔值
    beforeRead(file) {
      if (
        file.type !== "image/png" &&
        file.type !== "image/jpeg" &&
        file.type !== "image/jpg"
      ) {
        this.$toast.fail("请上传 png,jpg格式图片");
        return false;
      }
      return true;
    },
    // 文件上传大小限制
    onOversize(file) {
      this.$toast.fail("图片大小不能超过5M!");
    },
    //删除图片
    delImg(file, detail) {
      return new Promise((resolve, reject) => {
        this.$dialog
          .confirm({
            message: "确定删除图片?",
          })
          .then(() => {
            // this.form.faceImg.splice(detail.index, 1);
            this.form.faceImg = []; // 只有一张直接清空数组
            this.$toast.success("删除成功");
            resolve();
          })
          .catch((error) => {
            this.$toast.success("已取消");
            reject(error);
          });
      });
    },

    // 表单提交
    subForm() {
    // 表单验证
      this.$refs.forms.validate().then(() => {
          // 验证通过
          addPerson(this.form).then((response) => {
            if (response.code == 200) {
              this.$toast.success(
                "上传记录成功",
                this.$router.push({ path: "/xxx" })
              );
            } else {
              this.$toast.fail("上传记录失败");
            }
          });
        })
        .catch(() => {
          console.log("false");
          //验证失败
        });

}}

axios方法:

// 上传图片 参数需要file文件
export function uploadImg(file) {
    return request({
        url: '/xxx/xxx/uploadImg',
        method: 'post',
        data: file,
    })
}

补充:

如果遇到这种情况axios请求中需要加上headers:{。。。}

// 注册页面上传图片文件
export function uploadImg(data) {
  return request({
    url: '/system/bbuploadImg/uploadImg',
    method: 'post',
    data: data, 
    headers: {
      'Content-Type': 'multipart/form-data' // 注意:通常 Axios 会自动设置这个头部,所以这一步可以省略
    }
  })
}

虽然提供的引用中未直接提及 van-uploader 上传图片提示接口网络错误的解决方案,但可以从常见的处理思路来分析。 1. **检查网络连接**:首先要确保设备网络连接正常,可尝试切换网络环境,如从 Wi-Fi 切换到移动数据,或者反之,看是否能解决问题。 2. **检查接口地址和权限**:确认 van-uploader 配置的接口地址是否正确,包括协议、域名、端口和路径等。同时,要保证接口具有访问权限,可能需要检查跨域配置等。 3. **查看接口响应**:使用浏览器开发者工具(如 Chrome 的开发者工具)或者抓包工具(如 Fiddler)来查看接口请求和响应的详细信息。了解具体的错误状态码和错误信息,根据这些信息来定位问题。例如,如果是 404 错误,说明接口地址可能有误;如果是 500 错误,可能是服务器端出现了问题。 4. **检查上传参数**:确保 van-uploader 传递给接口的参数符合接口的要求,包括文件格式、文件大小限制等。有些接口可能对文件类型和大小有严格的要求,如果不符合,可能会导致上传失败。 5. **服务器端检查**:联系服务器端开发人员,检查服务器端的日志,看是否有相关的错误记录。服务器端可能存在性能问题、代码逻辑错误或者资源不足等情况,需要进行排查和修复。 ```javascript // 示例代码,设置 van-uploader上传地址和参数 <van-uploader :action="uploadUrl" :headers="headers" :data="uploadData" @success="onUploadSuccess" @fail="onUploadFail" /> <script> export default { data() { return { uploadUrl: 'your_upload_api_url', headers: { // 设置请求头 'Content-Type': 'multipart/form-data' }, uploadData: { // 设置上传参数 key: 'value' } }; }, methods: { onUploadSuccess(response) { // 上传成功处理 console.log('上传成功', response); }, onUploadFail(error) { // 上传失败处理 console.error('上传失败', error); } } }; </script> ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值