【layui快速入门】form表单里有图像文件怎么提交?

前言

form表单里有文件,比如图像文件、普通文本文件、音频视频文件,该怎么办?
解决方案总的有两种:

  1. 使用formData实现文件和文本同时提交
  2. 先ajax上传文件,返回文件url,再和文本一起提交,我称作伪提交。

本文主要介绍第二种伪提交方案,formData使用教程已在下方列出。
https://developer.mozilla.org/zh-CN/docs/Web/API/FormData/Using_FormData_Objects

正文

1、本文开发环境


 1. spring boot
 2. mysql
 3. java
 4. thymeleaf模板引擎
 5. layui库

2、layui使用教程
注:layui有一个upload模块,特别好用,本文就是使用upload模块完成了目标。官方文档对于upload模块的介绍很详细,所以我建议你好好研究研究官方文档,再看我的实例不迟!
layui模块的加载
http://www.layui.com/doc/
图片/文件上传 - layui.upload
http://www.layui.com/doc/modules/upload.html#choose

3、前后台代码
前端页面代码:

<form class="layui-form"  enctype="text/plain">
    <div class="layui-form-item">
        <label class="layui-form-label" >名称</label>
        <div class="layui-input-block">
            <input name="name" lay-verify="name" autocomplete="off" placeholder="请输入标题" class="layui-input" type="text"/>
        </div>
    </div>

    <div class="layui-form-item">
        <label class="layui-form-label">照片</label>
        <div class="layui-input-block">
            <button type="button" class="layui-btn" id="upload1">上传图片</button>
            <input type="hidden" id="img_url" name="img" value=""/>
            <div class="layui-upload-list">
                <img class="layui-upload-img" width="100px" height="80px" id="demo1"/>
                <p id="demoText"></p>
            </div>
        </div>
    </div>

    <div class="layui-form-item" style="text-align: center;">
        <button type="submit" class="layui-btn" onclick="update" value="保存"/>
        <button class="layui-btn" lay-submit=""  lay-filter="*" >立即提交</button>
    </div>
</form>

让我们看看下面这段涉及文件上传的代码。div里包含有一个button,一个隐藏的input(用于保存文件url),还有专门预览的div。

        <div class="layui-input-block">
            //上传按钮
            <button type="button" class="layui-btn" id="upload1">上传图片</button>
            //隐藏的input
            <input type="hidden" id="img_url" name="img" value=""/>
            //预览区域
            <div class="layui-upload-list">
                <img class="layui-upload-img" width="100px" height="80px" id="demo1"/>
                <p id="demoText"></p>
            </div>
        </div>

先上效果图
这里写图片描述

好了,现在我们继续,上js代码。在这段js代码里,最核心的事情只有三件

  1. 加载upload上传模块
  2. 给我的button加上上传文件的功能
  3. 上传成功后,将返回的url保存到隐藏的input中
<script type="text/javascript" th:inline="javascript">
    layui.use('upload', function(){
        var upload = layui.upload
            , $ = layui.jquery;
        var uploadInst = upload.render({
            elem: '#upload1' //绑定元素
            ,url: /*[[@{/upload/img}]]*/'' //上传接口
            ,before: function(obj){
                //预读本地文件示例,不支持ie8
                obj.preview(function(index, file, result){
                    $('#demo1').attr('src', result); //图片链接(base64)
                });
            }
            ,done: function(res){
                //如果上传失败
                if(res.code > 0){
                    return layer.msg('上传失败');
                }
                //上传成功
                alert("上传成功"+res.url);
                document.getElementById("img_url").value = res.url;

            }
            ,error: function(){
                //演示失败状态,并实现重传
                var demoText = $('#demoText');
                demoText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-mini demo-reload">重试</a>');
                demoText.find('.demo-reload').on('click', function(){
                    uploadInst.upload();
                });
            }
        });
    });
</script>

文件上传Controller


@Controller
@MultipartConfig
public class FileUploadController {
    @RequestMapping(value = "/upload/img" , method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object>  upload(HttpServletRequest servletRequest,
                         @RequestParam("file") MultipartFile file
                         ) throws IOException {

        //如果文件内容不为空,则写入上传路径
        if (!file.isEmpty()) {
            //上传文件路径
            String path = "/home/jian/Desktop/qingyunV2/qingyunv2/src/main/resources/static/images";

            System.out.println("文件名称"+file.getOriginalFilename());
            //上传文件名
            String filename = file.getOriginalFilename();
            File filepath = new File(path, filename);


            //判断路径是否存在,没有就创建一个
            if (!filepath.getParentFile().exists()) {
                filepath.getParentFile().mkdirs();
            }

            //将上传文件保存到一个目标文档中
            File file1 = new File(path + File.separator + filename);
            file.transferTo(file1);
            Map<String, Object> res = new HashMap<>();
            //返回的是一个url对象
            res.put("url", file1);
            return res;

        } else {
            return Result.failure();
        }

    }
}

至此文件上传任务已经完成了,现在表单中隐藏的input已经保存了文件的url,那么,接下来就是简单的纯文本form提交。这个不难,用ajax提交行,正常提交也可以,随意。下面,我仅仅贴出代码。

ajax提交纯文本form

<!--要给当前脚本加上th:inline="javascript",tymeleaf才能生效。self.location = /*[[@{/sys_seller/find}]]*/'';-->
<script type="text/javascript" th:inline="javascript">
    layui.use(['form', 'layedit'], function(){
        var form = layui.form
            , layer = layui.layer
            , $ = layui.jquery;
        form.on('submit(*)', function (data) {
            $.ajax({
                type: 'POST',
                url: /*[[@{/sys_seller/add}]]*/'',
                dataType: 'json',
                data: data.field,//往后台发送的是data.field,即一个{name:value}的数据结构
                async: true,
                success: function (result) {
                    if (result.code == 0) {
                        layer.msg('保存成功', {icon: 1, time: 1000});
                        setTimeout(function () {
                            self.location = /*[[@{/sys_seller/find}]]*/'';
                        }, 800);
                    } else {
                        layer.msg('保存失败!' + result.msg, {icon: 2, time: 1000});
                    }
                },
                error: function (result, type) {
                    layer.msg('保存失败!', {icon: 2, time: 1000});
                }
            });
        });
        return false;
    });
</script>

保存信息Controller


    @RequestMapping(value = "/sys_seller/add")
    @ResponseBody
    public Result add(@RequestParam("name") String name ,
                      @RequestParam("managername") String managername,
                      @RequestParam("phone") String phone,
                      @RequestParam("tel") String tel,
                      @RequestParam("remark") String remark,
                      @RequestParam("sellarrange") String sellarrange,
                      @RequestParam("province") String province,
                      @RequestParam("city") String city,
                      @RequestParam("address") String address,
                      @RequestParam("img") String img
                      ) throws IOException
    {
        Sellers seller = new Sellers();
        seller.setName(name);
        seller.setManagerName(managername);
        seller.setPhone(phone);
        seller.setTel(tel);
        seller.setRemark(remark);
        seller.setSellArrange(sellarrange);
        seller.setProvince(province);
        seller.setCity(city);
        seller.setAddress(address);
        seller.setImgurl(img);
        System.out.println(seller.toString());
        qingYunService.saveSeller(seller);
        return Result.success();
    }

小结

本文只做为一个引子,过多的东西我也说不明白,希望这些对你有所帮助。如果你想搞清整个提交细节的话,你需要了解@ResponseBodyAjax原理等基础知识。你需要打好基础,才会有万丈高楼平地起!

  • 8
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
可以使用 layui表单提交监听函数来实现多个表单提交一个的效果。 首先,给每个需要提交表单设置一个唯一的 id,然后在页面加载完成后,使用 layui 的 form.on() 方法监听表单提交事件,当任意一个表单提交时,获取该表单的数据并存储到一个全局变量中,然后阻止表单提交。当最后一个表单提交时,将存储的所有表单数据合并,然后使用 ajax 提交数据并清空存储的数据。 示例代码如下: HTML: ```html <!-- 表单1 --> <form class="layui-form" id="form1"> <div class="layui-form-item"> <label class="layui-form-label">用户名</label> <div class="layui-input-block"> <input type="text" name="username" required lay-verify="required" placeholder="请输入用户名" autocomplete="off" class="layui-input"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">密码</label> <div class="layui-input-block"> <input type="password" name="password" required lay-verify="required" placeholder="请输入密码" autocomplete="off" class="layui-input"> </div> </div> <div class="layui-form-item"> <div class="layui-input-block"> <button class="layui-btn" lay-submit lay-filter="form1">提交</button> </div> </div> </form> <!-- 表单2 --> <form class="layui-form" id="form2"> <div class="layui-form-item"> <label class="layui-form-label">姓名</label> <div class="layui-input-block"> <input type="text" name="name" required lay-verify="required" placeholder="请输入姓名" autocomplete="off" class="layui-input"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label">年龄</label> <div class="layui-input-block"> <input type="number" name="age" required lay-verify="required" placeholder="请输入年龄" autocomplete="off" class="layui-input"> </div> </div> <div class="layui-form-item"> <div class="layui-input-block"> <button class="layui-btn" lay-submit lay-filter="form2">提交</button> </div> </div> </form> ``` JavaScript: ```javascript // 定义一个全局变量,用于存储所有表单数据 var formData = {}; // 监听表单提交事件 layui.form.on('submit', function(data){ // 获取表单 id 和数据 var id = data.form.attr('id'); var data = data.field; // 将数据存储到全局变量中 formData[id] = data; // 如果不是最后一个表单提交,则阻止表单提交 if (Object.keys(formData).length < 2) { return false; } // 合并所有表单数据 var allData = {}; for (var key in formData) { allData = Object.assign(allData, formData[key]); } // 使用 ajax 提交数据 $.ajax({ url: 'http://example.com/submit', type: 'POST', data: allData, success: function(){ // 清空全局变量 formData = {}; // 提示用户提交成功 layer.msg('提交成功'); }, error: function(){ // 提示用户提交失败 layer.msg('提交失败,请重试'); } }); }); ``` 在上面的代码中,我们使用了 Object.keys() 方法来获取 formData 对象中属性的数量,然后判断当前提交表单是否为最后一个表单。如果不是最后一个表单,则阻止表单提交。最后一个表单提交时,我们使用 Object.assign() 方法将所有表单数据合并为一个对象,然后使用 ajax 提交数据。在提交成功或失败后,我们清空 formData 对象并提示用户。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值