若依表单中上传文件/图片

这篇具有很好参考价值的文章主要介绍了若依表单中上传文件/图片。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

效果图

我的需求的单图片上传,如果读者的需求是多图片。看完本篇之后,根据element文档把vue图片上传的部分代码进行更改就可以
若依表单中上传文件/图片
若依表单中上传文件/图片
若依表单中上传文件/图片

前端分析

在弄这个功能之前我是不知道vue有专门FormData类型用于上传文件和数值。但是在简单了解这个类型之后,就可以很快实现上述功能。
首先是创建(点击按钮方法中),不需要提前声明, this.formData = new FormData;
然后是添加属性(上传按钮方法中),this.formData.append('key', value);
最后将整个formData进行传送。
具体代码:
1.上传图片组件

        <!-- 添加或修改获奖信息管理对话框 -->
        <el-dialog :title="title" :visible.sync="open" width="650px" append-to-body>
          <el-form ref="form" :model="form" :rules="rules" label-width="80px">
          	<el-row>
       			表单数据部分代码,已省略,按需加入
          	</el-row>
          	<el-row>
			
			<!--     用于标记图片是否已上传         -->
       			<el-col :span="12">
                	<el-form-item label="获奖图片" prop="myIsUpload">
                  	<el-input  disabled v-model="form.myIsUpload" placeholder="未上传"/>
    	            </el-form-item>
              </el-col>
          	</el-row>
          	<el-row>
              <el-col :span="12">
                <el-form-item label-width="80px" label="上传图片">
                  <div  >
                    <!--elementui的form组件-->
                    <el-upload
                      action="#"
                      :show-file-list="false"
                      :auto-upload="false"
                      :multiple="false"
                      :on-change="uploadFile"
                      drag
                      accept="image/jpg,image/jpeg,image/png">
                      <i v-if="imageUrl" class="el-icon-circle-close deleteImg" @click.stop="handleRemove"></i>
                      <img v-if="imageUrl" :src="imageUrl" class="el-upload--picture-car"/>
                      <div v-else>
                        <i class="el-icon-picture" style="margin-top: 40px; font-size: 40px; color: #999a9c"></i>
                        <div>上传图片</div>
                        <div>格式为png、jpeg或jpg</div>
                      </div>
                    </el-upload>
                  </div>
                </el-form-item>
              </el-col>
              	 <el-col :span="12">
             	 </el-col>
            </el-row>
          </el-form>
          
          <div slot="footer" class="dialog-footer">
            <el-button type="primary" @click="submitForm">确 定</el-button>
            <el-button @click="cancel">取 消</el-button>
          </div>
        </el-dialog>
            

通过el-upload的属性 :on-change="uploadFile",可知选择图片后调用的函数:

    // 上传图片
    uploadFile(item) {
      this.imageUrl = URL.createObjectURL(item.raw); // 图片上传浏览器回显地址
      console.log(this.imageUrl, "imageUrl")
      console.log(this.formData, "formData")
      this.$set(this.form, 'myIsUpload', "已上传");
      // 将图片信息加入到formData中
      this.formData.append('file', item.raw, item.name);
    },
    handleRemove() {
      this.imageUrl = ""
    },

讲解:item记录了上传图片的信息
this.$set(this.form, 'myIsUpload', "已上传");的作用是标记此图片已上传,至于标记为什么用this.$set,请看这篇:https://blog.csdn.net/zhang8907xiaoyue/article/details/108289603
this.formData.append('file', item.raw, item.name); 将图片信息加入到formData中

---------------------------------------------分界线---------------------------------------------
通过确定按钮可知: @click="submitForm",提交函数:
分析:
我们表单的数据目前是存储在form中的,但是我们最终是用formData上传,所以需要将form中的属性全部加入到formData中。
加入之后,根据修改或是新增,调用相应的网络请求函数:
updateAward(this.formData) addAward(this.formData)

/** 提交按钮 */
    submitForm() {
      this.$refs["form"].validate(valid => {
        for (let key in this.form) {
          if (this.form.hasOwnProperty(key)) {
            if (!this.formData.has(key) && this.form[key] != 'null' && this.form[key] != null)
              this.formData.append(key, this.form[key]);
          }
        }
        if (valid) {
          if (this.form.awardId != null) {
            updateAward(this.formData).then(response => {
              this.$modal.msgSuccess("修改成功");
              this.open = false;
              this.getList();
              this.formData = null;
              this.form.myIsUpload = null;
            });
          } else {
            addAward(this.formData).then(response => {
              this.$modal.msgSuccess("新增成功");
              this.open = false;
              this.getList();
              this.formData = null;
              this.form.myIsUpload = null;
            });
          }
        }
      });
    },
     /** 修改按钮操作 */
    handleUpdate(row) {
      this.formData = new FormData;
      // 初始化图片
      this.imageUrl = row.certificateImageUrl;
      this.reset();
      const awardId = row.awardId || this.ids
      getAward(awardId).then(response => {
        this.form = response.data;
        this.open = true;
        this.title = "修改获奖信息管理";
      });
    }

网络请求函数:
注意不要加headers,网上有些答案是加入了这个,但也有很多加入了报错。
若依表单中上传文件/图片

// 新增获奖信息管理
export function addAward(data) {
  return request({
    url: '/competition/award',
    method: 'post',
    data: data,
    // headers: {
    //   'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundarynl6gT1BKdPWIejNq'
    // }
  })
}

// 修改获奖信息管理
export function updateAward(data) {
  return request({
    url: '/competition/award',
    method: 'put',
    data: data
  })
}
完整代码

vue

<template>
  <div class="app-container">
    <el-row :gutter="20">
      <!--部门数据-->
      <el-col :span="4" :xs="24">
        <div class="head-container">
          <el-input
            v-model="deptName"
            placeholder="请输入部门名称"
            clearable
            size="small"
            prefix-icon="el-icon-search"
            style="margin-bottom: 20px"
          />
        </div>
        <div class="head-container">
          <el-tree
            :data="deptOptions"
            :props="defaultProps"
            :expand-on-click-node="false"
            :filter-node-method="filterNode"
            ref="tree"
            node-key="id"
            default-expand-all
            highlight-current
            @node-click="handleNodeClick"
          />
        </div>
      </el-col>


      <el-col :span="20" :xs="24">
        <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch"
                 label-width="68px">
          <el-form-item label="项目名称" prop="projectName">
            <el-input
              v-model="queryParams.projectName"
              placeholder="请输入项目名称"
              clearable
              @keyup.enter.native="handleQuery"
            />
          </el-form-item>
          <el-form-item>
            <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
            <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
          </el-form-item>
        </el-form>

        <el-row :gutter="10" class="mb8">
          <el-col :span="1.5">
            <el-button
              type="primary"
              plain
              icon="el-icon-plus"
              size="mini"
              @click="handleAdd"
              v-hasPermi="['competition:award:add']"
            >新增
            </el-button>
          </el-col>
          <el-col :span="1.5">
            <el-button
              type="success"
              plain
              icon="el-icon-edit"
              size="mini"
              :disabled="single"
              @click="handleUpdate"
              v-hasPermi="['competition:award:edit']"
            >修改
            </el-button>
          </el-col>
          <el-col :span="1.5">
            <el-button
              type="danger"
              plain
              icon="el-icon-delete"
              size="mini"
              :disabled="multiple"
              @click="handleDelete"
              v-hasPermi="['competition:award:remove']"
            >删除
            </el-button>
          </el-col>
          <el-col :span="1.5">
            <el-button
              type="info"
              plain
              icon="el-icon-upload2"
              size="mini"
              @click="handleImport"
            >导入
            </el-button>
          </el-col>

          <el-col :span="1.5">
            <el-button
              type="warning"
              plain
              icon="el-icon-download"
              size="mini"
              @click="handleExport"
              v-hasPermi="['competition:award:export']"
            >导出
            </el-button>
          </el-col>
          <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
        </el-row>

        <el-table v-loading="loading" :data="awardList" @selection-change="handleSelectionChange">
          <el-table-column type="selection" width="55" align="center"/>
          <el-table-column label="#" align="center" prop="awardId"/>
          <el-table-column label="竞赛组织学院" align="center" prop="deptName"/>
          <el-table-column label="学号" align="center" prop="studentNo"/>
          <el-table-column label="姓名" align="center" prop="studentName"/>
          <el-table-column label="获奖竞赛" align="center" prop="competitionId"/>
          <el-table-column label="项目名称" align="center" prop="projectName"/>
          <el-table-column label="证书编号" align="center" prop="certificateNumber"/>
          <el-table-column label="获奖网址" align="center" prop="awardWebsite"/>
          <el-table-column label="竞赛级别" align="center" prop="competitionLevel"/>
          <el-table-column label="获奖等级" align="center" prop="awardLevel"/>
          <el-table-column label="获奖时间" align="center" prop="awardTime" width="180">

            <template slot-scope="scope">
              <span>{{ parseTime(scope.row.awardTime, '{y}-{m}') }}</span>
            </template>
          </el-table-column>
          <el-table-column label="证书图片" align="center" prop="certificateImageUrl" width="100">
            <template slot-scope="scope">
              <image-preview :src="scope.row.certificateImageUrl" :width="50" :height="50"/>
            </template>

          </el-table-column>
          <!--          <el-table-column label="组织机构" align="center" prop="organization">-->
          <!--            <el-upload-->
          <!--              v-model:file-list="fileList"-->
          <!--              class="upload-demo"-->
          <!--              action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"-->
          <!--              multiple-->
          <!--              :on-preview="handlePreview"-->
          <!--              :on-remove="handleRemove"-->
          <!--              :before-remove="beforeRemove"-->
          <!--              :limit="3"-->
          <!--              :on-exceed="handleExceed"-->
          <!--            >-->
          <!--              <el-button type="primary">Click to upload</el-button>-->
          <!--            </el-upload>-->
          <!--          </el-table-column>-->
          <el-table-column label="组织机构" align="center" prop="organization"/>
          <el-table-column label="重点竞赛" align="center" prop="isMain"/>
          <el-table-column label="项目涉航空类" align="center" prop="isAviation"/>
          <el-table-column label="竞赛类别" align="center" prop="competitionCategory"/>
          <el-table-column label="属于不降级竞赛" align="center" prop="isDemotion"/>
          <el-table-column label="指导教师1" align="center" prop="teacher1Name"/>
          <el-table-column label="指导教师2" align="center" prop="teacher2Name"/>
          <el-table-column label="指导教师3" align="center" prop="teacher3Name"/>
          <el-table-column label="团队名称" align="center" prop="teamName"/>
          <el-table-column label="学院" align="center" prop="stuDeptName"/>
          <el-table-column label="班级" align="center" prop="stuClassName"/>
          <el-table-column label="年级" align="center" prop="stuGradeName"/>
          <el-table-column label="专业" align="center" prop="stuMajorName"/>


          <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
            <template slot-scope="scope">
              <el-button
                size="mini"
                type="text"
                icon="el-icon-edit"
                @click="handleUpdate(scope.row)"
                v-hasPermi="['competition:award:edit']"
              >修改
              </el-button>
              <el-button
                size="mini"
                type="text"
                icon="el-icon-delete"
                @click="handleDelete(scope.row)"
                v-hasPermi="['competition:award:remove']"
              >删除
              </el-button>
            </template>
          </el-table-column>
        </el-table>

        <pagination
          v-show="total>0"
          :total="total"
          :page.sync="queryParams.pageNum"
          :limit.sync="queryParams.pageSize"
          @pagination="getList"
        />

        <!-- 添加或修改获奖信息管理对话框 -->
        <el-dialog :title="title" :visible.sync="open" width="650px" append-to-body>
          <el-form ref="form" :model="form" :rules="rules" label-width="80px">
            <el-row>
              <el-col :span="12">
                <el-form-item label="竞赛名称" prop="competitionId">
                  <el-select v-model="form.competitionId" placeholder="请选择竞赛">
                    <el-option
                      v-for="item in competitionsOption"
                      :key="item.value"
                      :label="item.label"
                      :value="item.value"
                      :disabled="item.disabled"
                    ></el-option>
                  </el-select>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="项目名称" prop="projectName">
                  <el-input v-model="form.projectName" placeholder="请输入项目名称"/>
                </el-form-item>
              </el-col>
            </el-row>
            <el-row>
              <el-col :span="12">
                <el-form-item label="学号" prop="studentNo">
                  <el-input v-model="form.studentNo" placeholder="请输入内容"/>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="证书编号" prop="certificateNumber">
                  <el-input v-model="form.certificateNumber" placeholder="请输入证书编号"/>
                </el-form-item>
              </el-col>
            </el-row>
            <el-row>
              <el-col :span="12">
                <el-form-item label="获奖网址" prop="awardWebsite">
                  <el-input v-model="form.awardWebsite" placeholder="请输入获奖网址"/>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="获奖时间" prop="awardTime">
                  <el-date-picker clearable
                                  v-model="form.awardTime"
                                  type="month"
                                  value-format="yyyy-MM"
                                  placeholder="请选择获奖时间">
                  </el-date-picker>

                </el-form-item>
              </el-col>
            </el-row>
            <el-row>
              <el-col :span="12">
                <el-form-item label="团队名称" prop="teamName">
                  <el-input v-model="form.teamName" placeholder="请输入团队名称"/>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="获奖等级" prop="awardLevel">
                  <el-select v-model="form.awardLevel" placeholder="请选择获奖等级">
                    <el-option
                      v-for="item in awardLevels"
                      :key="item"
                      :label="item"
                      :value="item"
                      :disabled="item.disabled"
                    ></el-option>
                  </el-select>
                </el-form-item>
              </el-col>
            </el-row>

            <el-row>
              <el-col :span="12">
                <el-form-item label="指导教师1" prop="teacher1Name">
                  <el-select v-model="form.teacher1No" placeholder="请选择指导教师1">
                    <el-option
                      v-for="item in teachersOption"
                      :key="item.value"
                      :label="item.label"
                      :value="item.value"
                      :disabled="item.disabled"
                    ></el-option>
                  </el-select>
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="指导教师2" prop="teacher2Name">
                  <el-select v-model="form.teacher2No" placeholder="请选择指导教师2">
                    <el-option
                      v-for="item in teachersOption"
                      :key="item.value"
                      :label="item.label"
                      :value="item.value"
                      :disabled="item.disabled"
                    ></el-option>
                  </el-select>
                </el-form-item>
              </el-col>
            </el-row>
            <el-row>
              <el-col :span="12">
                <el-form-item label="指导教师3" prop="teacher3Name">
                  <el-select v-model="form.teacher3No" placeholder="请选择指导教师3">
                    <el-option
                      v-for="item in teachersOption"
                      :key="item.value"
                      :label="item.label"
                      :value="item.value"
                      :disabled="item.disabled"
                    ></el-option>
                  </el-select>
                </el-form-item>
              </el-col>
<!--     用于标记图片是否已上传         -->
              <el-col :span="12">
                <el-form-item label="获奖图片" prop="myIsUpload">
                  <el-input  disabled v-model="form.myIsUpload" placeholder="未上传"/>
                </el-form-item>
              </el-col>
            </el-row>
            <el-row>
              <el-col :span="12">
                <el-form-item label-width="80px" label="上传图片">
                  <div id="upload2">
                    <!--elementui的form组件-->
                    <el-upload
                      action="#"
                      :show-file-list="false"
                      :auto-upload="false"
                      :multiple="false"
                      :on-change="uploadFile"
                      drag
                      accept="image/jpg,image/jpeg,image/png">
                      <i v-if="imageUrl" class="el-icon-circle-close deleteImg" @click.stop="handleRemove"></i>
                      <img v-if="imageUrl" :src="imageUrl" class="el-upload--picture-car"/>
                      <div v-else>
                        <i class="el-icon-picture" style="margin-top: 40px; font-size: 40px; color: #999a9c"></i>
                        <div>上传图片</div>
                        <div>格式为png、jpeg或jpg</div>
                      </div>
                    </el-upload>
                  </div>
                </el-form-item>
              </el-col>
              <el-col :span="12">
              </el-col>
            </el-row>
          </el-form>
          <div slot="footer" class="dialog-footer">
            <el-button type="primary" @click="submitForm">确 定</el-button>
            <el-button @click="cancel">取 消</el-button>
          </div>
        </el-dialog>
      </el-col>
    </el-row>

    <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
      <el-upload
        ref="upload"
        :limit="1"
        accept=".xlsx, .xls"
        :headers="upload.headers"
        :action="upload.url + '?updateSupport=' + upload.updateSupport"
        :disabled="upload.isUploading"
        :on-progress="handleFileUploadProgress"
        :on-success="handleFileSuccess"
        :auto-upload="false"
        drag
      >
        <i class="el-icon-upload"></i>
        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
        <div class="el-upload__tip text-center" slot="tip">
          <div class="el-upload__tip" slot="tip">
            <el-checkbox v-model="upload.updateSupport"/>
            是否更新已经存在的用户数据
          </div>
          <span>仅允许导入xls、xlsx格式文件。</span>
          <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;"
                   @click="importTemplate">下载模板
          </el-link>
        </div>
      </el-upload>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitFileForm">确 定</el-button>
        <el-button @click="upload.open = false">取 消</el-button>
      </div>
    </el-dialog>

  </div>
</template>

<script>
import {
  listAward,
  getAward,
  delAward,
  addAward,
  updateAward,
  getTeacher,
  getCompetition
} from "@/api/competition/award";
import {deleteComImg, getCompetitionImg} from "@/api/competition/Information";
import {getToken} from "@/utils/auth";
import {deptTreeSelect} from "@/api/system/user";

export default {
  name: "Award",
  data() {
    return {
      // 上传图片
      formData: "",
      imageUrl: "",
      orderId: "",
      userId: "",
      userName: "",
      //  导入*************
      // 用户导入参数
      upload: {
        // 是否显示弹出层(用户导入)
        open: false,
        // 弹出层标题(用户导入)
        title: "",
        // 是否禁用上传
        isUploading: false,
        // 是否更新已经存在的用户数据
        updateSupport: 0,
        // 设置上传的请求头部
        headers: {Authorization: "Bearer " + getToken()},
        // 上传的地址
        url: process.env.VUE_APP_BASE_API + "/competition/award/importData"
      },
      //  导入*************

      // 树形
      deptOptions: undefined,
      deptName: undefined,
      defaultProps: {
        children: "children",
        label: "label"
      },

      // 获奖等级
      awardLevels: [
        "国家级一等奖",
        "国家级二等奖",
        "国家级三等奖",
        "国家级优秀奖",
        "省级一等奖",
        "省级二等奖",
        "省级三等奖",
        "省级优秀奖",
      ],
      teachersOption: [],
      competitionsOption: [],
      // 遮罩层
      loading: true,
      // 选中数组
      ids: [],
      // 非单个禁用
      single: true,
      // 非多个禁用
      multiple: true,
      // 显示搜索条件
      showSearch: true,
      // 总条数
      total: 0,
      // 获奖信息管理表格数据
      awardList: [],
      // 弹出层标题
      title: "",
      // 是否显示弹出层
      open: false,

      // formData: null,

      // 查询参数
      queryParams: {
        deptId: null,
        pageNum: 1,
        pageSize: 10,
        competitionId: null,
        projectName: null,
        studentId: null,
        studentNo: null,
        certificateNumber: null,
        awardWebsite: null,
        competitionLevel: null,
        awardLevel: null,
        awardTime: null,
        certificateImageUrl: null,
        teacher3No: null,
        teacher2No: null,
        teamName: null,
        teacher1No: null,


      },
      // 表单参数
      form: {

      },
      // 表单校验
      rules: {
        competitionId: [
          {required: true, message: "竞赛名称不能为空", trigger: "blur"}
        ],
        projectName: [
          {required: true, message: "项目名称不能为空", trigger: "blur"}
        ],
        studentNo: [
          {required: true, message: "学号不能为空", trigger: "blur"}
        ],
        certificateNumber: [
          {required: true, message: "证书编号不能为空", trigger: "blur"}
        ],
        awardWebsite: [
          {required: true, message: "获奖网址不能为空", trigger: "blur"}
        ],
        competitionLevel: [
          {required: true, message: "竞赛级别不能为空", trigger: "change"}
        ],
        awardLevel: [
          {required: true, message: "获奖等级不能为空", trigger: "change"}
        ],
        awardTime: [
          {required: true, message: "获奖时间不能为空", trigger: "blur"}
        ],
        myIsUpload: [
          {required: true, message: "请上传图片", trigger: "input"}
        ],
      },
      // -------------------图片
      number: 0,
      uploadList: [],
      dialogImageUrl: "",
      dialogVisible: false,
      hideUpload: false,
      baseUrl: process.env.VUE_APP_BASE_API,
      uploadImgUrl: process.env.VUE_APP_BASE_API + "/competition/image/multiPicturesUpload", // 上传的图片服务器地址
      headers: {
        Authorization: "Bearer " + getToken(),
        awardId: -1,
      },
      fileList: [],
      // -------------------图片

    };
  },
  created() {
    this.getList();
    this.getTeachers();
    this.getCompetitions();
    this.getDeptTree();
  },
  methods: {
    // 图片上传
    // 上传图片
    uploadFile(item) {
      // this.formData = item.raw; // 图片文件
      this.imageUrl = URL.createObjectURL(item.raw); // 图片上传浏览器回显地址
      console.log(this.imageUrl, "imageUrl")
      console.log(this.formData, "formData")
      this.formData = new FormData;
      this.$set(this.form, 'myIsUpload', "已上传");
      this.formData.append('file', item.raw, item.name);

    },
    handleRemove() {
      this.imageUrl = ""
    },


    // 导入**************
    /** 导入按钮操作 */
    handleImport() {
      this.upload.title = "用户导入";
      this.upload.open = true;
    },
    /** 下载模板操作 */
    importTemplate() {
      this.download('/competition/award/importTemplate', {}, `获奖信息导入模板_${new Date().getTime()}.xlsx`)
    },

    // 文件上传中处理
    handleFileUploadProgress(event, file, fileList) {
      this.upload.isUploading = true;
    },
    // 文件上传成功处理
    handleFileSuccess(response, file, fileList) {
      this.upload.open = false;
      this.upload.isUploading = false;
      this.$refs.upload.clearFiles();
      this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", {dangerouslyUseHTMLString: true});
      this.getList();
    },
    // 提交上传文件
    submitFileForm() {
      this.$refs.upload.submit();
    },
// 导入**************

//树形***************
// 筛选节点
    filterNode(value, data) {
      if (!value) return true;
      return data.label.indexOf(value) !== -1;
    }
    ,
// 节点单击事件
    handleNodeClick(data) {
      this.queryParams.deptId = data.id;
      this.handleQuery();
    }
    ,
    /** 查询部门下拉树结构 */
    getDeptTree() {
      deptTreeSelect().then(response => {
        this.deptOptions = response.data;
      });
    }
    ,
//树形***************

    getTeachers() {
      getTeacher().then(res => {
        this.teachersOption = res.optionInfos;
      })
    }
    ,
    getCompetitions() {
      getCompetition().then(res => {
        this.competitionsOption = res.optionInfos;
      })
    }
    ,
    /** 查询获奖信息管理列表 */
    getList() {
      this.loading = true;
      listAward(this.queryParams).then(response => {
        this.awardList = response.rows;
        this.total = response.total;
        this.loading = false;
      });
    }
    ,
// 取消按钮
    cancel() {
      this.open = false;
      this.reset();
    }
    ,
// 表单重置
    reset() {
      this.form = {
        awardId: null,
        competitionId: null,
        projectName: null,
        studentId: null,
        studentNo: null,
        certificateNumber: null,
        awardWebsite: null,
        competitionLevel: null,
        awardLevel: null,
        awardTime: null,
        certificateImageUrl: null,
        teacher3No: null,
        teacher2No: null,
        teamName: null,
        teacher1No: null
      };
      this.resetForm("form");
    }
    ,
    /** 搜索按钮操作 */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.getList();
    }
    ,
    /** 重置按钮操作 */
    resetQuery() {
      this.resetForm("queryForm");
      this.handleQuery();
    }
    ,
// 多选框选中数据
    handleSelectionChange(selection) {
      this.ids = selection.map(item => item.awardId)
      this.single = selection.length !== 1
      this.multiple = !selection.length
    }
    ,
    /** 新增按钮操作 */
    handleAdd() {
      console.log("-- " + this.form.myIsUpload);
      //  初始化图片
      this.handleRemove();
      this.reset();
      this.open = true;
      this.title = "添加获奖信息管理";
    }
    ,
    /** 修改按钮操作 */
    handleUpdate(row) {
      // 初始化图片
      // console.log(row.certificateImageUrl);
      this.imageUrl = row.certificateImageUrl;
      this.reset();
      const awardId = row.awardId || this.ids
      getAward(awardId).then(response => {
        this.form = response.data;
        this.open = true;
        this.title = "修改获奖信息管理";
      });
    }
    ,
    /** 提交按钮 */
    submitForm() {
      this.$refs["form"].validate(valid => {
        for (let key in this.form) {
          if (this.form.hasOwnProperty(key)) {
            if (!this.formData.has(key) && this.form[key] != 'null' && this.form[key] != null)
              this.formData.append(key, this.form[key]);
          }
        }
        if (valid) {
          if (this.form.awardId != null) {
            updateAward(this.formData).then(response => {
              this.$modal.msgSuccess("修改成功");
              this.open = false;
              this.getList();
              this.formData = null;
              this.form.myIsUpload = null;
            });
          } else {
            addAward(this.formData).then(response => {
              this.$modal.msgSuccess("新增成功");
              this.open = false;
              this.getList();
              this.formData = null;
              this.form.myIsUpload = null;
            });
          }
        }
      });
    }
    ,
    /** 删除按钮操作 */
    handleDelete(row) {
      const awardIds = row.awardId || this.ids;
      this.$modal.confirm('是否确认删除获奖信息管理编号为"' + awardIds + '"的数据项?').then(function () {
        return delAward(awardIds);
      }).then(() => {
        this.getList();
        this.$modal.msgSuccess("删除成功");
      }).catch(() => {
      });
    }
    ,
    /** 导出按钮操作 */
    handleExport() {
      this.download('competition/award/export', {
        ...this.queryParams
      }, `award_${new Date().getTime()}.xlsx`)
    }
  },

//*********************************图片下
};
</script>
<style scoped lang="scss">
.upload-file-uploader {
  margin-bottom: 5px;
}

.upload-file-list .el-upload-list__item {
  border: 1px solid #e4e7ed;
  line-height: 2;
  margin-bottom: 10px;
  position: relative;
}

.upload-file-list .ele-upload-list__item-content {
  display: flex;
  justify-content: space-between;
  align-items: center;
  color: inherit;
}

.ele-upload-list__item-content-action .el-link {
  margin-right: 10px;
}
</style>

后端分析

后端我用的是Minio存储,但是具体大家如何存储就看需求了,存储方便比较简单,但是一定注意一个点

不要在实体类(Award)前加@RequestBody注解,要在MultipartFile 前加@RequestParam注解

    @PostMapping
    public AjaxResult add(Award award, @RequestParam("file") MultipartFile file) {
        存储图片的代码
        return toAjax(awardService.insertAward(award));
    }
修改功能的坑

如果按上面代码,那么在修改时会遇到两个问题:
1:点击修改,前端提示没有上传图片
2:如果1解决,后端会提示“MultipartFile为空请求地址异常Required request part ‘file’ is not present”
解决方案:
1:原因是我们用了一个属性对是否已经上传文件进行标记,可以在实体类中写一个属性
若依表单中上传文件/图片
之前我曾尝试这样解决:若依表单中上传文件/图片
但是不行,我也没有深究。如果有了解的同学,请留言啊~

2:如果在修改数据时,没有重新上传图片,那么file肯定是空的,因为我是在上传图片的方法中将file加入到formData里面的。可以在controller设置一下
若依表单中上传文件/图片

写这个小功能我踩了不少坑,也看了很多博客,最后总结解决了这个问题,虽然是小功能,但花了不少时间解决BUG。
不知道有多少同学看到最后呢~文章来源地址https://www.toymoban.com/news/detail-402297.html

到了这里,关于若依表单中上传文件/图片的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 利用ArcGIS Pro制作三维效果图

    1、新建工程 打开Arcgispro,新建工程,这里我们要用到的模板为全局场景。 这里添加的数据需要有一个字段内容是数值的,这个字段也是接下来要进行拉伸的字段。 3、高度拉伸 数据添加进来后,如下图所示,这时图层处于2D图层里。 这时我们点中该图层,回到菜单栏,点击

    2024年02月16日
    浏览(27)
  • AIGC 360全景图 效果图材质替换

    首先感叹一下AIGC的效果,如下图所示 AUTOMATIC1111 WebUI Prompts Positive and Negative提示词 LoRa 插件 LoRa: LatentLabs360 on CivitAI ControlNet 插件 Deep-checkpoints模型文件地址 Lora-Script 训练脚本 Panorama-Viewer查看全景图插件 网络问题自己搭梯子,一些安装环境可以调整(gradio==3.16.2) 感谢 秋葉

    2024年02月09日
    浏览(27)
  • 数据可视化:随时间变化的效果图

    获取北京、上海、江苏、广东四省的2008—2012年的GDP数据 在Jupyter Notebook上实现代码如下:

    2023年04月12日
    浏览(30)
  • 炫云云渲染3ds max效果图渲染教程

    很多人在第一次使用炫云云渲染渲染效果图的时候不知道怎么使用,其实现在使用炫云渲染效果图真的很简单,我们一起来看看。 一客户端安装 1、打开炫云云渲染官网,点击右上角的客户端下载,选择炫云客户端(NEXT版),进入下载页面下载客户端。 2、客户端下载下来后

    2024年02月07日
    浏览(23)
  • 3d效果图的应用场景和3d渲染的发展前景

    3D效果图一直都是视觉行业非常重要的一部分,它在不同领域都有广泛应用,通过效果图,设计师能够准确展示设计方案,方便沟通。本文将深入分析3D效果图在不同场景中的应用和未来发展趋势。 1、建筑领域 在建筑领域中,3D效果图被用于房屋、商场和酒店等的设计,通过

    2024年01月23日
    浏览(43)
  • 微信小程序实现输入车牌号码的功能(附效果图)

    实现用户输入车牌的功能 可以输入 正常车牌以及新能源车牌 1 . wxml 文件

    2024年02月11日
    浏览(49)
  • 运用pyecharts制作可视化大屏(代码展示及效果图-动图)

    一、Matplotlib绘图 折线图 import matplotlib.pyplot as plt # 调用画图库 plt.rcParams[\\\'font.sans-serif\\\'] = [\\\'SimHei\\\'] # 设置成可以显示中文,字体为黑体 plt.figure( figsize =(12,8)) # 调整图片尺寸 x = [\\\'周一\\\',\\\'周二\\\',\\\'周三\\\',\\\'周四\\\',\\\'周五\\\',\\\'周六\\\',\\\'周日\\\'] # 设置x轴数据 y = [401,632,453,894,775,646,1207] # 设置对应

    2024年02月05日
    浏览(33)
  • echarts看板效果图:流光折线图、3d柱状图、3d饼图、3d地图

    现在展厅的大看板是越花里胡哨越好,不过真的挺难做的。好在可以百度找到一些大神的作品进行参考。 下面的内容都是基于 echarts 5.3.3 和 vue3 。另外demo都是参考别人的案例。 效果图 代码 本质上是两条线组合在一起的,一条是静态的线条,一条是动态的线条。相关属性都

    2024年02月06日
    浏览(32)
  • 如何解决3d max渲染效果图全白这类异常问题?

    通过3d max渲染效果图时,经常会出现3Dmax渲染效果图全黑或是3Dmax渲染效果图全白这类异常问题。可能遇到这类问题较多的都是新手朋友。不知如何解决。 3dmax渲染出现异常的问题,该如何高效解决呢?今天小编这里整理几项知识点,大家可以快快一起看起来! 1、相机的位置

    2024年01月17日
    浏览(65)
  • 分享几款节日实用前端动画特效(附效果图及在线预览)

    分享7款有趣也实用的前端动画特效 其中有CSS动画、canvas动画、js小游戏等等 下方效果图可能不是特别的生动 那么你可以点击在线预览进行查看相应的动画特效 同时也是可以下载该资源的 基于canvas实现的一款节日背景动画 当鼠标悬停时会在悬停处不断的冒爱心等动画效果

    2024年01月20日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包