MVC下实现表单上传视频Servlet处理详解

    在web开发中对于视频的处理必不可少,前台的视频播放功能也成为普遍应用。下面将近来做项目时做视频上传的具体步骤做一个记录:

1、首先一个上传的表单如下:

<form action="VideoUploadServlet" method="post" enctype="multipart/form-data" name="theform" >
		<table bgcolor="#CCCCFF" width="900px"  >
			<tr bgcolor="#CCCCCC">
				<td colspan="3" align="center">(注:视频文件占用服务器空间较大,已控制上传的视频文件小于20M,可以提供上传的视频文件包括avi、MP4、flv、mov、wmv、3gp、swf、asf等类型的视频文件)<br/><br/><b>视频新闻上传</b><br/></td>
			</tr>
			<tr>
				<td colspan="3"><br/></td>
			</tr>
			<tr>
				<td>视频标题:</td>
				<td><input type="text" size="60" name="title" id="title" /></td>
				<td id="innert"><font  size='1px'>*必填</font></td>
			</tr>
			<tr>
				<td colspan="3"><br/></td>
			</tr>
			<tr>
				<td>视频文件:</td>
				<td><input type="file" size="50" name="vedeo" /></td>
				<td >*必填</td>
			</tr>
			<tr>
				<td colspan="3"><br/></td>
			</tr>
			<tr>
				<td>视频转码类型:</td>
				<td>
					<select name="qscale">
						<option value="6" selected>标准转码----默认编码转码</option>
	  					<option value="4" >高品质转码----视频文件大小会增加较多(空间大时可使用)</option>
	  				</select><br/>	
				</td>
				<td >*默认为标准转码</td>
			</tr>
			
			
			<tr>
				<td colspan="3"><br/></td>
			</tr>
			<tr align="center">
				<td colspan="3">
					<input type="button" value="上传" name="but" onClick="checkSubmit();">
					<input type="reset" value="重置">
				</td>
			</tr>
			<tr>
				<td colspan="3" align="center" id="cache"></td>
			</tr>
		</table>
		</form>

以上带HTML代码没有进行重复提交的处理,该处理在上一篇博客中重复提交处理

2、下载commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar两个归档文件放在lib目录下,下面将是提交时servlet的处理:

public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html");
		HttpSession session=request.getSession();
		
		
		//先创建一个存储文件的文件夹(目录),有的话不创建 
		File f=new File(this.getServletContext().getRealPath("/") + "uploadvideo");
		f.mkdir();
		
		DiskFileItemFactory factory = new DiskFileItemFactory() ;
		// 更准确的说是创建一个上传时的一个临时文件,也放在该目录下
		//factory.setRepository(new File(this.getServletContext().getRealPath("/") + "uploadvideo")) ;		
		ServletFileUpload upload = new ServletFileUpload(factory) ;
		// 设置一次只能最大上传20M,但下面有判断,这里就不再设定
		//upload.setFileSizeMax(20*1024*1024) ;	
		
		//将表单信息全部拿过来,放在一个List中
		List<FileItem> items = null;
		try {
			items = upload.parseRequest(request);
		} catch (FileUploadException e) {
			e.printStackTrace();
		} 
		// 以上是接收全部内容,再放到一个迭代器中以便于输出
		Iterator<FileItem> iter = items.iterator() ;
		
		//调用定义的文件重命名的类com.util.FileName
		FileName its = new FileName() ;
		boolean isupload=true;  //参数判断是否上传了
		long videosize=0;
		String fileRoot="";//视频文件路径
		String fend="";	//上传的文件后缀名
		String ftime="";//文件的时间戳
		Vector<String>  vpara=new Vector(); //存放上传的文本参数
		while(iter.hasNext()){
			FileItem item = iter.next() ;
			//String fieldName = item.getFieldName() ;	// 取得表单控件的名称
			//没有填写完整时弹出警告
			if(item.getString().equals("")){
				request.setAttribute("info", "没有填写标题或文件,上传失败!");
				request.getRequestDispatcher("isUpload.jsp").forward(request, response);
				isupload=false;
				break;
			}
			if(!item.isFormField())// 不是普通文本时,时视频时将视频上传到指定文件夹
			{		
				//取得上传的视频的大小
				videosize=item.getSize();
				fend=item.getName().split("\\.")[1].toLowerCase();
				if(!fend.equals("avi")&&!fend.equals("mp4")&&!fend.equals("mov")&&!fend.equals("swf")&&!fend.equals("wmv")&&!fend.equals("3gp")&&!fend.equals("flv")&&!fend.equals("asf")){
					request.setAttribute("info", "文件只能为avi、MP4、flv、mov、wmv、3gp、swf、asf等类型的视频文件,非此类别文件可以下载视频转码器转码后上传");
					request.getRequestDispatcher("isUpload.jsp").forward(request, response);
					isupload=false;
					break;
				}
				else if(videosize>20*1024*1024){
					request.setAttribute("info", "文件大小超过20M,上传失败。");
					request.getRequestDispatcher("isUpload.jsp").forward(request, response);
					isupload=false;
					break;
				}else{
					InputStream input = null ;
					OutputStream output = null ;
					input = item.getInputStream() ;
					
					ftime=its.getIPTimeRand();
					fileRoot=this.getServletContext().getRealPath("/")+"uploadvideo"+File.separator+ftime;
					output = new FileOutputStream(new File(fileRoot+"."+fend)) ;
					int temp = 0 ;
					byte data[] = new byte[512] ;
					while((temp=input.read(data,0,512))!=-1){
						output.write(data) ;	// 分块保存
					}
					input.close() ;
					output.close() ;
					
				}
			} 
			else 
			{
				 String value= item.getString();
				 vpara.add(value);
			}
		}	

同时上传完后放入数据库中:

//上传成功便将该条记录存入数据库
			String nid =String.valueOf(videosize);   //与其他文章不同,为了使用同一个表,将Nid存入文件的大小,以便后台管理空间,单位B
			Date date = new Date();
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-ddhhmmss");
			String str = sdf.format(date); 
			String time = str.substring(0,10);
			int number = 0 ;
			String createuser="";
			createuser=(String)session.getAttribute("user");
			String content="uploadvideo"+File.separator+ftime+".flv";
			String attribute="spxw";
			String table="news";
			String file="uploadvideo"+File.separator+ftime+".jpg";
			…………这里插入数据库……		    
			if(n!=-1){
				request.setAttribute("info", "视频文件上传成功!");
			}else{
		    	request.setAttribute("info","视频上传失败,数据库未连接!");
		    }
			request.getRequestDispatcher("isUpload.jsp").forward(request, response);
			
			}
	}
}	


3、在部署后项目根目录下的upload文件夹就是文件路径。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值