vue含附件的表单提交

此帖的主要目的是记录以下三点:
1、使用elementUI的上传附件。
2、vue使用FormData,向接口传送表单数据(含附件)。
3、接口从HttpServletRequest中获取请求数据,通过@RequestPart(“USER_PHOTO_”) MultipartFile USER_PHOTO_获取附件数据。

1、使用elementUI的上传附件

                            <el-upload action="uploadAction" list-type="picture-card"
                                       :on-preview="handlePictureCardPreview" 
                                       :on-remove="handleRemove"
                                       :limit="1" 
                                       :show-file-list="true" 
                                       name="img" 
                                       ref="upload" 
                                       :data="userForm"
                                       accept="image/png,image/gif,image/jpg,image/jpeg"
                                       :on-exceed="handleExceed" 
                                       :auto-upload="false"
                                       :on-error="uploadError" 
                                       :before-upload="handleBeforeUpload"
                                       :on-change="changeFile">
                                <i class="el-icon-plus"></i>
                            </el-upload>
 //文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用
            onChange(file, fileList) {
                console.log(file.raw);
                console.log(this.$refs.userPhoto);
                this.userForm.imageUrl = URL.createObjectURL(file.raw);
            },
            
            // 上传文件之前的钩子
            handleBeforeUpload(file) {
                console.log('按钮', this.titleMap)
                if (!(file.type === 'image/png' || file.type === 'image/gif' || file.type === 'image/jpg' || file.type ===
                    'image/jpeg')) {
                    this.$notify.warning({
                        title: '警告',
                        message: '请上传格式为image/png, image/gif, image/jpg, image/jpeg的图片'
                    })
                }
                let size = file.size / 1024 / 1024 / 2;
                if (size > 2) {
                    this.$notify.warning({
                        title: '警告',
                        message: '图片大小必须小于2M'
                    })
                }

            },
            //图片上传超过数量限制
            handleExceed(files, fileList) {
                this.$message.error("上传图片不能超过1张!");
            },
            handleRemove(file, fileList) {
                this.$message.error("删除成功!");
            },
            // 图片上传失败时
            uploadError() {
                this.$message.error("图片上传失败!");
            },
            //预览图片
            handlePictureCardPreview(file) {
                this.dialogImageUrl = file.url;
                this.dialogVisible = true;
            },
            //文件改变时 on-change方法 ,fileList[0].raw 就是传给后端的值
            //filelist这个对象里面有很多属性,我们上传文件时,实际上传的是filelist列表中每一项的raw,只有raw可以正常上传, 获取到文件后,需要定义变量保存文件。所以需要获取filelist中的raw进行保存。
            //这里我用的formdata上传多文件,console打印formdata,文件在控制台中显示的格式为binary。

            changeFile(file, fileList) {
                this.userForm.imageUrl = fileList[0].raw
            },

2、vue使用FormData,向接口传送表单数据(含附件)
2-1:画面html部分

<!-- 编辑界面 -->
            <!--
                <el-dialog>对话框标签:
                1、title属性:对话框的标题;
                2、visible属性:决定对话框是否显示
            -->
            <el-dialog :title="title" :visible.sync="editFormVisible" width="35%" @click='closeDialog("edit")'>
                <!--
                    <el-form>表单标签
                    1、model属性:表单数据对象
                    2、rules属性:表单验证规则
                -->
                <!--表单填写部分-->
                <div style="width: 50%">
                    <el-form label-width="90px" ref="userForm" :model="userForm" :rules="rules">
                        <el-form-item label="ID:" prop="ID_" style="display: none">
                            <el-input size="small" v-model="userForm.ID_" auto-complete="off"
                                      style="display: none"></el-input>
                        </el-form-item>
                        <el-form-item label="员工工号:" prop="USER_CODE_">
                            <!--
                                <el-input>输入框标签
                                1、auto-complete属性:是否启动自动完成功能。当用户在字段开始键入时,浏览器基于之前键入过的值,应该显示出在字段中填写的选项。
                            -->
                            <el-input size="small" v-model="userForm.USER_CODE_" auto-complete="off"
                                      placeholder="请输入员工工号"></el-input>
                        </el-form-item>
                        <el-form-item label="员工姓名:" prop="USER_NAME_" class="form_item">
                            <el-input size="small" v-model="userForm.USER_NAME_" auto-complete="off"
                                      placeholder="请输入员工姓名"></el-input>
                        </el-form-item>
                        <el-form-item label="所属部门:" prop="DEPT_NAME_" class="form_item">
                            <el-select size="small" v-model="userForm.DEPT_NAME_" placeholder="请选择" style="width: 100%"
                                       @change="selectPost">
                                <el-option v-for="item in dept" :key="item.key" :label="item.DEPT_NAME_"
                                           :value="item.DEPT_CODE_"/>
                            </el-select>
                        </el-form-item>
                        <el-form-item label="岗位:" prop="POST_NAME_" class="form_item">
                            <el-select size="small" v-model="userForm.POST_NAME_" placeholder="请选择" style="width: 100%">
                                <el-option v-for="item in post" :key="item.key" :label="item.POST_NAME_"
                                           :value="item.POST_CODE_"/>
                            </el-select>
                        </el-form-item>
                        <el-form-item label="角色:" prop="ROLE_" class="form_item">
                            <el-select size="small" v-model="userForm.ROLE_" placeholder="请选择" style="width: 100%">
                                <el-option label="主任" value="1"></el-option>
                                <el-option label="职员" value="2"></el-option>
                            </el-select>
                        </el-form-item>
                        <el-form-item label="联系方式" prop="USER_PHONE_" class="form_item">
                            <el-input size="small" v-model="userForm.USER_PHONE_" placeholder="请输入手机号"></el-input>
                        </el-form-item>
                        <el-form-item label="出生日期" prop="USER_BIRTHDAY_" class="form_item">
                            <el-date-picker v-model="userForm.USER_BIRTHDAY_" type="date"
                                            format="yyyy 年 MM ⽉ dd ⽇"
                                            value-format="yyyy-MM-dd"
                                            placeholder="选择日期"></el-date-picker>
                        </el-form-item>
                        <el-form-item label="性别" prop="USER_SEX_" class="form_item">
                            <el-radio v-model="userForm.USER_SEX_" label=""></el-radio>
                            <el-radio v-model="userForm.USER_SEX_" label=""></el-radio>
                        </el-form-item>
                        <el-form-item label="照片" class="form_item">

                            <el-upload action="uploadAction" list-type="picture-card"
                                       :on-preview="handlePictureCardPreview"
                                       :on-remove="handleRemove"
                                       :limit="1"
                                       :show-file-list="true"
                                       name="img"
                                       ref="upload"
                                       :data="userForm"
                                       accept="image/png,image/gif,image/jpg,image/jpeg"
                                       :on-exceed="handleExceed"
                                       :auto-upload="false"
                                       :on-error="uploadError"
                                       :before-upload="handleBeforeUpload"
                                       :on-change="changeFile">
                                <i class="el-icon-plus"></i>
                            </el-upload>
                        </el-form-item>
                    </el-form>
                </div>
                <div slot="footer">
                    <el-button size="small" @click='closeDialog("edit")'>取消</el-button>
                    <el-button size="small" type="primary" :loading="loading" @click="submitForm('userForm')">保存
                    </el-button>
                </div>
            </el-dialog>

2-2:vue.js部分

//2-2-1  在data()中声明数据
                // 编辑与添加
                userForm: {
                    ID_: '',
                    USER_CODE_: '',
                    USER_NAME_: '',
                    DEPT_NAME_: '',
                    POST_NAME_: '',
                    ROLE_: '',
                    USER_PHONE_: '',
                    USER_BIRTHDAY_: '',
                    USER_SEX_: '',
                    photo: '',
                    imageUrl: ''
                },
 //2-2-2   在methods{}中写与后台联动的函数
  //新增用户
            insertUser(params) {
                let that = this;
                let fd = new FormData();
                fd.append('USER_CODE_', params.USER_CODE_);
                fd.append('USER_NAME_', params.USER_NAME_);
                fd.append('DEPT_NAME_', params.DEPT_NAME_);
                fd.append('POST_NAME_', params.POST_NAME_);
                fd.append('ROLE_', params.ROLE_);
                fd.append('USER_PHONE_', params.USER_PHONE_);
                fd.append('USER_BIRTHDAY_', params.USER_BIRTHDAY_);
                fd.append('USER_SEX_', params.USER_SEX_);
                fd.append('USER_PHOTO_', that.userForm.imageUrl);

                axios({
                    method: 'POST',
                    url: '/api/insertUser',
                    data:fd,
                    timeout: 2000,
                    headers: {
                        'Content-Type': 'multipart/form-data'
                    },
                }).then(function (res) {
                    console.log(res);
                    if (res.data.success) {
                        that.editFormVisible = false;//关闭新增窗口
                        that.$message({
                            message: '添加用户成功',
                            type: 'success'
                        });
                        that.selectUser();//调用查询方法,目的是刷新页面
                    }
                    else {
                        that.$message.error('添加用户失败');
                    }
                }).catch(function (err) {
                    /*请求失败*/
                    that.$message.error('添加用户失败');
                });
            }

2-3;数据库表结构
在这里插入图片描述2-4:后台接口部分(没用实体类)

//下面是controller层
  //新增用户
    @RequestMapping(value = "insertUser")
    @ResponseBody
    public Map<String, Object> insertUser( @RequestPart("USER_PHOTO_") MultipartFile USER_PHOTO_, HttpServletRequest request, HttpServletResponse response, HttpSession session) {
        Map<String, Object> result = new HashMap<String, Object>();

        String USER_CODE_ = request.getParameter("USER_CODE_");
        String USER_NAME_ = request.getParameter("USER_NAME_");
        String DEPT_NAME_ = request.getParameter("DEPT_NAME_");
        String POST_NAME_ = request.getParameter("POST_NAME_");
        String ROLE_ = request.getParameter("ROLE_");
        String USER_PHONE_ = request.getParameter("USER_PHONE_");
        String USER_SEX_ = request.getParameter("USER_SEX_");
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        Date USER_BIRTHDAY_ = null;//String类型改成Date
        try {
            USER_BIRTHDAY_ = formatter.parse(request.getParameter("USER_BIRTHDAY_"));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        InputStream userPhoto_InputStream = null;
        Integer userPhoto_Length_ = null;
        try {
            userPhoto_InputStream = USER_PHOTO_.getInputStream();// 获得上传二进制流
            userPhoto_Length_ = (int) USER_PHOTO_.getSize();
//            if (SEAL_LENGTH_ >= BaseConfig.getMaxUploadSize()) {// 上传文件大小限制检查
//                throw new Exception(getLocaleMessage("errors.uploadingFilesIsTooBig", null, request));
//            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            String ID_ = BaseUtils.getUuid();
            if (userService.insertUser(ID_, USER_CODE_, USER_NAME_, DEPT_NAME_, POST_NAME_, ROLE_, USER_PHONE_, USER_BIRTHDAY_, USER_SEX_, userPhoto_InputStream, userPhoto_Length_) == 0) {
                throw new Exception();
            }
            response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
            response.setHeader("Access-Control-Allow-Credentials", "true");

            result.put("success", true);
        } catch (Exception e) {
            System.out.println(e);
            response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
            response.setHeader("Access-Control-Allow-Credentials", "true");

            result.put("success", false);
            StringWriter stringWriter = new StringWriter();
            e.printStackTrace(new PrintWriter(stringWriter));
        }

        return result;
    }


//下面是service层和impl层,没有实体类

    /*
     * 新增用户
     */
    public int insertUser(String ID_, String USER_CODE_, String USER_NAME_, String DEPT_NAME_, String POST_NAME_, String ROLE_, String USER_PHONE_, Date USER_BIRTHDAY_, String USER_SEX_, InputStream USER_PHOTO_,Integer USER_PHOTO_LENGTH_);

    @Override
    public int insertUser(String ID_, String USER_CODE_, String USER_NAME_, String DEPT_NAME_, String POST_NAME_, String ROLE_, String USER_PHONE_, Date USER_BIRTHDAY_, String USER_SEX_, InputStream USER_PHOTO_, Integer USER_PHOTO_LENGTH_) {
        String sql = "insert into v_employee (ID_, USER_CODE_, USER_NAME_, DEPT_NAME_, POST_NAME_, ROLE_, USER_PHONE_,  USER_BIRTHDAY_, USER_SEX_, USER_PHOTO_, USER_PHOTO_LENGTH_) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
        return qxJdbcTemplate.update(sql, new Object[]{ID_, USER_CODE_, USER_NAME_, DEPT_NAME_, POST_NAME_, ROLE_, USER_PHONE_, USER_BIRTHDAY_, USER_SEX_, new SqlLobValue(USER_PHOTO_, USER_PHOTO_LENGTH_, new DefaultLobHandler()), USER_PHOTO_LENGTH_}, new int[]{Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR, Types.VARCHAR,  Types.DATE, Types.VARCHAR, Types.BLOB, Types.INTEGER});
    }



  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 中实现附件批量上传可以使用第三方库,比如 `vue-upload-component`。下面是一个简单的示例代码: 首先,安装 `vue-upload-component`: ```bash npm install vue-upload-component ``` 然后,在你的 Vue 组件中使用该组件: ```vue <template> <div> <vue-upload-component ref="upload" :url="uploadUrl" :multiple="true" @input-file="handleFileUpload" ></vue-upload-component> <button @click="uploadFiles">上传</button> </div> </template> <script> import VueUploadComponent from 'vue-upload-component'; export default { components: { VueUploadComponent, }, data() { return { uploadUrl: '/your-upload-url', files: [], }; }, methods: { handleFileUpload(files) { this.files = files; }, uploadFiles() { // 在这里执行上传逻辑,比如使用 axios 或其他方式发送请求 // 可以遍历 this.files 数组,对每个文件执行上传操作 // 示例中只打印文件名 this.files.forEach((file) => { console.log(file.name); }); }, }, }; </script> ``` 上述示例中,`vue-upload-component` 组件被引入并在模板中使用。通过 `ref` 属性可以获取到该组件的实例。`url` 属性指定上传文件的服务器端接口地址。`multiple` 属性设置为 `true`,允许多文件上传。`@input-file` 事件会在用户选择文件后触发,将选中的文件作为参数传递给 `handleFileUpload` 方法。 `uploadFiles` 方法中可以执行实际的上传操作。这里只是简单地打印了每个文件的文件名,你可以根据具体需求使用适当的方式进行文件上传操作。 请注意将示例代码中的 `/your-upload-url` 替换为真实的上传接口地址。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值