layui表单和文件上传

layui 专栏收录该内容
1 篇文章 0 订阅

layui表单和文件上传

近期用layui写了一个在表单中上传文件,因为这个表单和文件上传让我费劲了脑汁,因为第一次使用layui所以很多东西摸不清楚,后来查了资料才知道layui文件上传和from表单提交是异步的,分为两次提交,接下来我们详细介绍

话不多说,先上代码
html代码:

<form class="layui-form" id="userForm" enctype="multipart/form-data" method="post">
		<div class="layui-form-item">
			<label class="layui-form-label">下拉框</label>
			<div class="layui-input-block">
				<select name="main_id" lay-filter="shiPinFenLei" class="status1">
				<option value="0">请选择</option>
				</select>
			</div>
		</div>
		<div class="layui-form-item">
		    <label class="layui-form-label">文本框</label>
		    <div class="layui-input-block">
		      <input type="text" name="son_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">
				<select name="aid" lay-filter="biaoti" class="area">
					
				</select>
			</div>
		</div>
		<div class="layui-form-item" id="charge">
			<label class="layui-form-label">是否付费</label>
			<div class="layui-input-block">
				<input type="radio"  lay-filter="charge" name="ChargeType" value="1" title="付费">
				<input type="radio" name="ChargeType" lay-filter="charge1" value="2" title="免费">
			</div>
		</div>
		<div class="layui-form-item" id="charge">
			<label class="layui-form-label">视频类型</label>
			<div class="layui-input-block">
				<input type="radio" name="status" value="1" title="类型1">
				<input type="radio" name="status" value="2" title="类型2">
			</div>
		</div>
		<div class="layui-form-item layui-form-text">
    <label class="layui-form-label">文本域</label>
    <div class="layui-input-block">
      <textarea name="content" placeholder="请输入内容" class="layui-textarea"></textarea>
    </div>
  </div>
		<div class="layui-form-item" id="urltop">
    <label class="layui-form-label">文件路径</label>
    <div class="layui-input-block">
      <input type="text" name="url" required  lay-verify="required" placeholder="此框不可进行更改" id="url" autocomplete="off"  class="layui-input">
    </div>
  </div>
		<div class="layui-upload">
		  <button type="button" class="layui-btn layui-btn-normal" id="testList">选择多文件</button> 
		  <div class="layui-upload-list">
		    <table class="layui-table">
		      <thead>
		        <tr><th>文件名</th>
		        <th>大小</th>
		        <th>状态</th>
		        <th>操作</th>
		      </tr></thead>
		      <tbody id="demoList"></tbody>
		    </table>
		  </div>
		  <button type="button" class="layui-btn" id="testListAction"><i class="layui-icon layui-icon-file-b"></i>开始上传</button>
		</div> 
		<div class="layui-form-item" style="margin-left: 60%">
			<div class="layui-input-block">
				<button class="layui-btn btn-submit" lay-filter="demo1" lay-submit="" id="commit">立即提交</button>
				<button type="reset" class="layui-btn layui-btn-primary">重置</button>
			</div>
		</div>
	</form>

js代码:

<script>
		layui.use(['form', 'layer', 'upload'], function() {
			var form = layui.form, $ = layui.$; //只有执行了这一步,部分表单元素才会自动修饰成功
			var layer = layui.layer;
	        var upload = layui.upload;
	        $("#urltop").hide();
			form.render();
			$.ajax({
				url : "main_List",
				dataType : "json",
				type : "post",
				success : function(data) {
					console.log(data);
					for ( var i in data) {
						var sec = data[i];
						$(".status1").append("<option value="+sec.main_id+">"+sec.main_name+"</option>")
					}
					form.render();//菜单渲染 把内容加载进去
				}
			})
			form.on('radio(charge)',function (data){
				$("#price").remove();
				$("#charge").after("<div class='layui-form-item' id='price'>"
					   +" <label class='layui-form-label'>请输入价格</label>"
					   +" <div class='layui-input-block'>"
					   +"   <input type='text' name='price' placeholder='请输入价格' autocomplete='off' class='layui-input'>"
					   +" </div>"
					  +" </div>")
			});
			form.on('radio(charge1)',function (data){
				$("#price").remove();
			});
		 	form.on('select(shiPinFenLei)',function(data){
		 		$(".area").empty();
				$.ajax({
					url : "area_List",
					dataType : "json",
					type : "post",
					data:{"id":$(".status1").val()},
					success : function(data) {
						console.log(data);
						for ( var i in data) {
							var sec = data[i];
							$(".area").append("<option value="+sec.aid+">"+sec.area+"</option>")
						}
						form.render();//菜单渲染 把内容加载进去
					}
				})
			}) 
			//上传文件代码,我这里是上传的视频
			 var demoListView = $('#demoList')
			  ,uploadListIns = upload.render({
			    elem: '#testList'
			    ,url: 'vedioLoad'
			    ,exts:'mp4|wmv|avi|dmv|amv|3GP|rmvb|flv'
			    ,accept: 'video'
			    ,multiple: true
			    ,auto: false
			    ,bindAction: '#testListAction'
			    ,choose: function(obj){   
			      var files = this.files = obj.pushFile(); //将每次选择的文件追加到文件队列
			      //读取本地文件
			      obj.preview(function(index, file, result){
			        var tr = $(['<tr id="upload-'+ index +'">'
			          ,'<td>'+ file.name +'</td>'
			          ,'<td>'+ (file.size/1014).toFixed(1) +'kb</td>'
			          ,'<td>等待上传</td>'
			          ,'<td>'
			            ,'<button class="layui-btn layui-btn-xs demo-reload layui-hide">重传</button>'
			            ,'<button class="layui-btn layui-btn-xs layui-btn-danger demo-delete">删除</button>'
			          ,'</td>'
			        ,'</tr>'].join(''));
			        
			        //单个重传
			        tr.find('.demo-reload').on('click', function(){
			          obj.upload(index, file);
			        });
			        
			        //删除
			        tr.find('.demo-delete').on('click', function(){
			          delete files[index]; //删除对应的文件
			          tr.remove();
			          uploadListIns.config.elem.next()[0].value = ''; //清空 input file 值,以免删除后出现同名文件不可选
			        });
			        
			        demoListView.append(tr);
			      });
			    }
			    ,done: function(res, index, upload){
			      if(res.code == 0){ //上传成功
			        var tr = demoListView.find('tr#upload-'+ index)
			        ,tds = tr.children();
			        tds.eq(2).html('<span style="color: #5FB878;">上传成功</span>');
			        tds.eq(3).html(''); //清空操作
			        $("#url").val(res.data);//上传成功后把得到的参数赋值给我这里的url路径这个文本框中
			        return delete this.files[index]; //删除文件队列已经上传成功的文件
			      }
			      this.error(index, upload);
			    }
			    ,error: function(index, upload){
			      var tr = demoListView.find('tr#upload-'+ index)
			      ,tds = tr.children();
			      tds.eq(2).html('<span style="color: #FF5722;">上传失败</span>');
			      tds.eq(3).find('.demo-reload').removeClass('layui-hide'); //显示重传
			    }
			  });
			  //当文件已经上传成功后,得到从后端返回到前端的文件上传路径,伴随着form表单一起提交
			form.on('submit(demo1)',function (data){
				var fd = new FormData();
	            var formData = new FormData($( "#userForm" )[0]);
	            $.ajax({
	                cache : true,
	                type : "post",
	                url : "vedioAdd",
	                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(ret.msg, {
	                            icon: 1,
	                            title:"提示"
	                        });
	                        setTimeout(function () {
	                            window.location.href="videoUpload";
	                        },2000);
	                    }
	                }
	             })
	             return false;
			})
		});
	</script>

这样的话,文件先上传,form表单后提交,两者不冲突,文件上传后得到从后端返回到前端的文件上传的路径,随着form表单一起提交到数据库中
到这,form表单和文件上传就结束了,第一次写博客,有点生疏,有什么不对的地方请大佬多多指教

  • 4
    点赞
  • 2
    评论
  • 12
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值