本文详细介绍如何使用Layui框架实现Form表单在提交普通数据的同时上传文件。通过配置layui.upload模块与form表单的交互,结合Java后端接收MultipartFile和实体对象,完整展示了从HTML结构、JS异步处理到后端Spring MVC接口的实现流程,解决前后端文件与数据混合提交的问题。
Layui Form表单同时提交数据和文件的方法及代码
首先,在JSP页面中构建用户注册的弹出框界面。
HTML表单结构定义
在HTML代码部分,定义一个带有id为userForm的form元素,并设置enctype属性为mutipart/form-data以支持文件上传。表单内包含隐藏域用于存储ID,以及用户名输入框等表单项。同时,添加立即注册按钮和重置按钮,分别绑定提交和重置事件。
<%--用户注册的弹出框--%>
<div id="userDiv" style="display: none;">
<form class="layui-form" id="userForm" lay-filter="deptForm" enctype="mutipart/form-data">
<input type="hidden" name="id">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label" >用户名</label>
<div class="layui-input-inline">
<input type="text" name="name" placeholder="6~18位,请使用数字或字母" lay-verify="checkName|username|required" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">密码</label>
<div class="layui-input-inline">
<input type="password" id="password" name="password" lay-verify="required" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">确认密码</label>
<div class="layui-input-inline">
<input type="password" lay-verify="required|checkPwd" class="layui-input">
</div>
</div>
<%--图片上传功能--%>
<div>
<button type="button" name="url" class="layui-btn" id="test1">上传头像</button>
<img class="layui-upload-img" id="photo" width="100" height="100">
<p id="demoText"></p>
</div>
<hr/>
<div class="layui-form-item" id="btn">
<div class="layui-input-block">
<button id="get" lay-filter="reg" class="layui-btn btn-submit" type="button" lay-submit="">立即注册</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</div>
</form>
</div>
JavaScript上传逻辑配置
在JavaScript代码中,使用layui的upload模块配置头像上传功能。通过指定elem绑定本地图片选择器,url指向后台接口/reg。设置auto为false以禁用自动提交,并通过bindAction绑定到特定按钮触发上传。在choose回调中预读本地图片显示预览,在done回调中处理上传结果,根据返回状态判断是否成功注册并跳转登录页或提示错误信息。
//上传头像的方法
var uploadInst = upload.render({
elem: '#test1' /*根据绑定id,打开本地图片*/
,url: '/reg' /*上传后台接受接口*/
,auto: false /*true为选中图片直接提交,false为不提交根据bindAction属性上的id提交*/
,bindAction: '#get'
,drag:true
,auto: false
,choose:function(obj){
//预读本地文件示例,不支持ie8
obj.preview(function(index, file, result){
$('#photo').attr('src', result); //图片链接(base64)
});
}
,done: function(res){
//如果上传失败
if(res.code > 0){
return layer.msg('上传失败');
}
//上传成功
}
,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();
});
}
});
//提交表单的方法
form.on('submit(reg)', function (data) {
var fd = new FormData();
var formData = new FormData($( "#userForm" )[0]);
$.ajax({
cache : true,
type : "post",
url : "/reg",
async : false,
data : formData, // 你的formid
contentType: false, //jax 中 contentType 设置为 false 是为了避免 JQuery 对其操作,从而失去分界符,而使服务器不能正常解析文件
processData: false, //当设置为true的时候,jquery ajax 提交的时候不会序列化 data,而是直接使用data
error : function(request) {
layer.alert('操作失败', {
icon: 2,
title:"提示"
});
},
success : function(ret) {
if (ret.success) {
layer.alert('注册成功', {
icon: 2,
title:"提示"
});
layer.closeAll();
window.location.href="/login" rel="external nofollow" ;
} else {
layer.alert(ret.msg, {
icon: 2,
title:"提示"
});
}
}
})
});
后端接口处理实现
后台处理采用Java Spring MVC框架。控制器方法接收MultipartFile类型的文件参数和User实体对象,以及HttpServletRequest请求。在try块中,获取服务器上传目录路径,若文件不为空,则生成随机文件名并保存至指定目录。随后调用userService.save方法保存用户信息,若密码验证通过则完成注册。异常情况下返回错误信息,成功则返回JsonResult对象。
@ResponseBody
@RequestMapping ("/reg")
public JsonResult save(MultipartFile file, User user, HttpServletRequest request){
try {
String path = request.getSession().getServletContext().getRealPath("upload");
String pathPhoto = "/upload";
if(!file.isEmpty()){
String name = file.getOriginalFilename();//获取接受到的图片名称
String newFileName = UUID.randomUUID().toString().substring(0,5)+"."+ FilenameUtils.getExtension(name);
File fi = new File(path,newFileName); //将path路径与图片名称联系在一起
if(!fi.getParentFile().exists()){ //判断是否存在path路径下的文件夹
fi.getParentFile().mkdirs(); //不存在创建path路径下的文件夹
}
file.transferTo(fi); //上传图片
user.setImgurl(pathPhoto+"/"+newFileName); //为保存图片路径
}
if(!StringUtil.isEmpty(user.getName()) && !StringUtil.isEmpty(user.getPassword())){
userService.save(user);
}
} catch (Exception e) {
e.printStackTrace();
return new JsonResult(false,e.getMessage());
}
return new JsonResult();
}
以上即为Layui实现form表单同时提交数据和文件的完整代码示例,供开发者参考使用。