提交文件到后端的方法


在项目中我们经常会遇到图片的上传问题,对于后端工程师来说,前端相对来说很薄弱.在此总结了两种简单的提交图片到后台的方法.

一. 表单同步提交

在商品管理时,新增一个商品时,需要为商品插入一个图片,在这里我们使用表单提交的方式,将表单的数据全部提交到后台.步骤如下

1. 搭建前端界面

作为一个强迫症,为了界面不那么丑使用了bootstrap的样式,所以需要导入bootstrap的包,
bootstrap.min.js和bootstrap.min.css;
还有jquery的包也需要导入;
在这里插入图片描述
界面大概是这样;

2. 作为强迫症,选择图片必须要看到预览图.

大概思路是,在文件上传框添加一个change事件,然后获取当前文件的路径,在将其路径赋值给图片的src属性;

实现代码如下:

<label for="" class="col-sm-2 control-label">车辆图片</label>
            <div class="col-sm-4 pfilediv">
                <img src="" style="width: 200px;height: 100px" class="img" id="carimg"/>
            </div>
            <div class="col-sm-4 pfilediv">
                <input type="file" id="pfile" name="carPic" style="margin-top: 70px ; margin-left: 20px">
            </div>
<script type="text/javascript">
    $("#pfile").change(function () {
        var file = this.files[0];
        if (window.FileReader) {
            var reader = new FileReader();
            reader.readAsDataURL(file);
            //监听文件读取结束后事件
            reader.onloadend = function (e) {
                $("#carimg").attr("src", e.target.result); 
                   //e.target.result就是最后的路径地址
            };
        }
    })
</script>

在这里插入图片描述
写完后大概长这样;

3. 表单提交

图片上所有的信息实际上就是一个表单,在表单提交时会将其提交到后台,但为了能提交文件到后台,我们需要为表单做一些设置;

<form id="inputForm" class="form-horizontal" 
		action="/car/addCar" enctype="multipart/form-data"  method="post">
	action 是提交到哪里
	eqctype ="multipart/form-data"  是支持提交文件
	此外提交方式必须为 method="post";

4. 前端完整代码如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title></title>
    <link rel="stylesheet" href="../css/bootstrap.min.css">
    <script type="application/javascript" src="../js/jquery-3.3.1.js"></script>
    <script type="application/javascript" src="../js/bootstrap.min.js"></script>
</head>
<style>
    #uppp {
        width: 600px;
        height: 400px;
    }

    #md1, #md2 {
        width: 260px;
        float: left;
    }

    #md1 {
        width: 100px;
        margin-right: 10px;
    }

    .top {
        margin-top: 40px;
        margin-left: 40px;
    }

    .info {
        width: 600px;
        height: 500px;
        margin: 20px 20px;
    }

    #addsub {
        margin-left: 100px;
    }

    #sell {
        margin-top: 20px;
        margin-left: 70px;
    }

    .bb {
        margin-left: 400px;
    }
</style>
<body>
<div class="bb">
    <form id="inputForm" class="form-horizontal" action="/car/addCar" enctype="multipart/form-data"
          method="post">
        <div class="info">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
                        aria-hidden="true"></span>
                </button>
                <div>
                    <span class="itemTitle-red ">填写车辆信息</span><br>
                </div>

            </div>
            <div class="modal-body" id="">

                <div class="form-group">
                    <label for="cname" class="col-sm-2 control-label">车辆名称</label>
                    <div class="col-sm-8">
                        <input type="text" class="form-control" id="cname" name="cname">
                    </div>
                </div>
                <div class="form-group">
                    <label for="type" class="col-sm-2 control-label">车辆类型</label>
                    <div class="col-sm-8">
                        <input type="text" class="form-control" id="type" name="type">
                    </div>
                </div>
                <div class="form-group">
                    <label for="sitnum" class="col-sm-2 control-label">座位数</label>
                    <div class="col-sm-8">
                        <input type="text" class="form-control" id="sitnum" name="sitnum">
                    </div>
                </div>
                <div class="form-group">
                    <label for="price" class="col-sm-2 control-label">价格/</label>
                    <div class="col-sm-8">
                        <input type="text" class="form-control capital mui-input-clear" id="price"
                               name="price">
                    </div>
                </div>
                <div class="form-group">
                    <label for="" class="col-sm-2 control-label">车辆图片</label>
                    <div class="col-sm-4 pfilediv">
                        <img src="" style="width: 200px;height: 100px" class="img" id="carimg"/>
                    </div>
                    <div class="col-sm-4 pfilediv">
                        <input type="file" id="pfile" name="carPic" style="margin-top: 70px ; margin-left: 20px">
                    </div>
                </div>

            </div>
            <div class="modal-footer">
                <input type="submit" class="btn btn-success "
                       id="addsub" value="新增车辆">
                </input>
            </div>
        </div>
    </form>
</div>


</body>
<script type="text/javascript">

    $("#pfile").change(function () {
        var file = this.files[0];
        if (window.FileReader) {
            var reader = new FileReader();
            reader.readAsDataURL(file);
            //监听文件读取结束后事件
            reader.onloadend = function (e) {
                $("#carimg").attr("src", e.target.result);    //e.target.result就是最后的路径地址
            };
        }
    })
</script>
</html>

5. 后端的接收

//添加车辆信息
    @RequestMapping(value = "/addCar", method = RequestMethod.POST)
    @ResponseBody
    public Msg2 addCar(Car car, MultipartFile carPic) {
        //上传图片,成功返回存放路径
        String filePath = QiNiuUpload.uploadFile(carPic);
        System.out.println(filePath );
        
        if (fileName != null) {
        	//将文件的存放路径赋值给商品对象,插入到数据库中
            car.setPicture(filePath );
            //将整个car对象插入数据库中
            int addcar = carService.addCar(car);
            if (addcar != 0) {
                return new Msg2(1, "新增成功");
            }
        }
        return new Msg2(0, "添加失败");
    }

二. 表单异步提交

在我们修改商品图片的时候,我们往往希望图片的上传是异步上传的,在这里为了简单实现,我使用jquery的from插件来实现文件的异步上传.

1 . 百度下载jquery的from插件.jquery-form.js

2. 在jsp页面导入jquery-form.js包

3. 创建vue对象与表单双向绑定

为了模拟修改商品的场景,我们将表单的数据设置一些初始值.
在这里插入图片描述

3. 上传图片并返回图片的云存储路径

3.1 为file文件上传框添加change()事件

在这里我们为文件上传的input添加一个@change事件,这是一个vue语法,类似于js的修改事件.当我们修改了input的文件,会触发这个事件.
请添加图片描述

3.2 在change事件中设置表单异步上传

$("#inputForm").ajaxSubmit(options);

其中的options是设置一些上传参数的,具体说明有注释,等价于

<form id="inputForm" action="/car/update" enctype="multipart/form-data"
		          method="post">

代码如下:

fileup: function () {
	alert("上传图片事件触发")
	var options = {
	     type: 'POST',
	     dataType: 'json',
	     url: '/car/upFile',
	     success: function showResponse(responseText) {
	         if (responseText.code == 1) {
	             alert(responseText.code)
	             carinfos.carInfo.picture = responseText.info;
	             alert(carinfos.carInfo.picture);
	         } else {
	             alert(responseText.info);
	         }
	     },
	     error: function (xhr, status, err) {
	         alert("上传失败");
	     },
	     resetForm: true    // 成功提交后,重置表单填写内容
	 };
	 $("#inputForm").ajaxSubmit(options);
}

我们将返回的图片地址赋值给vue绑定的变量,它会实时的显示在页面上,如下图
请添加图片描述

4. 将整个表单的数据再次异步提交,此时提交的数据是插入到数据库中.

完整的HTML页面代码如下:

 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title></title>
    <link rel="stylesheet" href="../css/bootstrap.min.css">
    <script type="application/javascript" src="../js/jquery-3.3.1.js"></script>
    <script type="application/javascript" src="../js/bootstrap.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>
    <%--一. 导入异步上传表单的插件--%>
    <script type="text/javascript" src="../js/jquery-form.js"></script>
</head>
<style>
    #uppp {
        width: 600px;
        height: 400px;
    }

    #md1, #md2 {
        width: 260px;
        float: left;
    }

    #md1 {
        width: 100px;
        margin-right: 10px;
    }

    .top {
        margin-top: 40px;
        margin-left: 40px;
    }

    .info {
        width: 600px;
        height: 500px;
        margin: 20px 20px;
    }

    #addsub {
        margin-left: 100px;
    }

    #sell {
        margin-top: 20px;
        margin-left: 70px;
    }

    .bb {
        margin-left: 400px;
    }
</style>
<body>
<div class="bb">
    <form id="inputForm" class="form-horizontal" enctype="multipart/form-data"
          method="post">
        <div class="info">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
                        aria-hidden="true"></span>
                </button>
                <div>
                    <span class="itemTitle-red ">填写车辆信息</span><br>
                </div>

            </div>
            <div class="modal-body" id="">

                <div class="form-group">
                    <label for="cid" class="col-sm-2 control-label">车辆ID</label>
                    <div class="col-sm-8">
                        <input type="text" readonly class="form-control" id="cid" name="cid" v-model="carInfo.cid">
                    </div>
                </div>
                <div class="form-group">
                    <label for="cname" class="col-sm-2 control-label">车辆名称</label>
                    <div class="col-sm-8">
                        <input type="text" class="form-control" id="cname" name="cname" v-model="carInfo.cname">
                    </div>
                </div>
                <div class="form-group">
                    <label for="type" class="col-sm-2 control-label">车辆类型</label>
                    <div class="col-sm-8">
                        <input type="text" class="form-control" id="type" name="type" v-model="carInfo.type">
                    </div>
                </div>
                <div class="form-group">
                    <label for="sitnum" class="col-sm-2 control-label">座位数</label>
                    <div class="col-sm-8">
                        <input type="text" class="form-control" id="sitnum" name="sitnum" v-model="carInfo.sitnum">
                    </div>
                </div>
                <div class="form-group">
                    <label for="price" class="col-sm-2 control-label">价格/天</label>
                    <div class="col-sm-8">
                        <input type="text" class="form-control capital mui-input-clear" id="price"
                               name="price" v-model="carInfo.price">
                    </div>
                </div>

                <div class="form-group">

                    <label for="" class="col-sm-2 control-label">车辆图片</label>

                    <div class="col-sm-4" style="width: 80px;height: 80px">
                        <input type="image" class="img" :src="carInfo.picture"
                               style="width: 80px;height: 80px;">
                    </div>

                    <div class="col-sm-4 pfilediv">
                        <input type="file" id="pfile" name="carimg" @change="fileup()"
                               style="margin-top: 40px ; margin-left: 20px">
                    </div>
                </div>


            </div>
            <div class="modal-footer">
                <input type="submit" class="btn btn-success "
                       id="addsub" value="新增车辆">
                </input>
            </div>
        </div>
    </form>
</div>


</body>
<script type="text/javascript">
    /*二 。 将表单数据与vue对象双向绑定*/
    var carinfos = new Vue({
        el: '#inputForm',
        data: {
            carInfo: {
                cid: 1,
                cname: "大众帕萨特",
                picture: "https://web-api.chesudi.com/img/carTypeimage/ScarTypeimage/%E5%A4%A7%E4%BC%97%E5%B8%95%E8%90%A8%E7%89%B9.png",
                type: "手自一体",
                sitnum: 5,
                price: 982,
                number: 5,
                type: "手自一体"
            },
        },
        methods: {
            /*三。 添加图片的修改事件*/
            fileup: function () {
                alert("上传图片事件触发")
                var options = {
                    type: 'POST',//提交方式必须为post
                    dataType: 'json',//接受后端返回值的格式
                    url: '/car/upFile',//提交的位置
                    success: function showResponse(responseText) {
                        if (responseText.code == 1) {
                            //将返回的涂炭地址赋值给表单的图片显示的input
                            carinfos.carInfo.picture = responseText.info;

                        } else {
                            alert(responseText.info);
                        }
                    },
                    error: function (xhr, status, err) {
                        alert("上传失败");
                    },
                    resetForm: true    // 成功提交后,重置表单填写内容
                };
                $("#inputForm").ajaxSubmit(options);
                //设置表单的异步上传.id为提交表单的id

            }
        }
    })

    //   四 .  用户修改确认按钮
    function update2() {
        if (confirm("确认修改?")) {
//        向后端发出修改请求后,获得成功信息,再关闭模态窗体
            $.ajax({
                type: 'put',
                url: '/car/update',
//            请求数据 ,将json对象转为字符串
                data: JSON.stringify(carinfos.carInfo),
//            定义发送请求数据类型
                contentType: 'application/json',
//            定义接收的相应数据类型
                dataType: 'json',
                success: function (data) {
                    if (data.code == 1) {
//                    重新加载数据列表
                        loadPage(1)
                    } else {
                        alert("修改失败")
                    }
                }
            });
            $("#myModal").modal("hide");
        }
    }
</script>
</html>

5. 后端接受数据;

因为这个例子我们向服务器提交了两次请求,所以会有两个接口来处理数据.

1. 处理上传图片的接口

上传图片我们使用七牛云来上传,具体流程看我的上一篇博客spring-mvc文件云存储功能

//只上传图片的
@RequestMapping(value = "/upFile", method = RequestMethod.POST)
@ResponseBody
public Msg2 upFile(HttpServletRequest request, MultipartFile carimg) {
    //在这里使用七牛云上传文件
    String fileName = FileUp.fileUp(request, carimg);
    System.out.println(fileName);
    if (fileName != null) {
        return new Msg2(1, fileName);
        //msg2,是自己定义的传递消息的工具类,封装状态码和返回数据
    }
    return new Msg2(0, "上传没有成功");
}

2. 处理修改商品信息的接口

//修改
@RequestMapping(value = "/update", method = RequestMethod.PUT)
@ResponseBody
public Msg2 updateAll(@RequestBody Car car) {
    int update = carService.updateCar(car);
    if (update != 0) {
        return new Msg2(1, update);
    }
    return new Msg2(0, "错误修改");
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值