JSP+Servlet+JavaBean实现文件上传

利用JSP+Servlet+JavaBean实现用户管理系统中的照片上传的程序片段。

本片段主要使用的jar包有commons-fileupload.jar,commons-io.jar,jstl.jar,standard.jar,我附件上都有,请自行下载。其中fileupload和io用于上传文件。jstl和standard用于文件的页面显示。

 

费话少说,直接进入程序片段,具体的讲解会出现在程序片段中,请大家自行观察。

 

upload.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
	function checkFile(){
		//在表单中添加一个隐藏元素,目的是测试是否获得动态的用户名,以便在Servlet中接收并传递到数据库中
		var f = document.uploadForm.photo.value ;
		//用元素的id获得该元素的值,从而进行判断选择的文件是否合法
		var file = document.uploadForm.p.value ;
		if(file==null||file==""){
			alert("你还没有选择任何文件,不能上传!") ;
			return ;
		}
		if(file.lastIndexOf(".")==-1){
			alert("路径不正确!") ;
			return ;
		}
		var allImgExt = ".jpg|.jpeg|.gif|.bmp|.png|" ;
		var extName = file.substring(file.lastIndexOf(".")) ;
		if(allImgExt.indexOf(extName+"|")==-1){
			
			errMsg="该文件类型不允许上传。请上传 "+allImgExt+" 类型的文件,当前文件类型为"+extName;
            alert(errMsg);
            return;
		}
		document.uploadForm.submit() ;
	}
</script>
<style type="text/css">
<!--
.STYLE1 {
	font-family: "新宋体";
	font-weight: bold;
	font-size: 24px;
}

.STYLE3 {
	font-size: 16px
}

.STYLE4 {
	color: #FF0000
}

.STYLE6 {
	font-family: Arial, Helvetica, sans-serif
}
-->
</style>
</head>
<body>
	<jsp:useBean id="user" scope="session" class="com.ysj.model.UserBean"></jsp:useBean>
		<div align="center" class="STYLE1">
			欢迎
				<jsp:getProperty property="name" name="user" />
			光临
			<br />
			<br/>
		</div>
		<hr/>
		<%
			String message = (String)request.getAttribute("message") ;
			if(message!=null){
				out.println(message) ;
			}
			String name = user.getName() ;
		%>
//action为Servlet的URL,enctype的值必须为multipart/form-data
 <form action="uploadServlet" method="POST" enctype="multipart/form-data" name="uploadForm">
	<table align="center">
		<tr>
			<td>请选择要上传的照片:</td>
			<td><input type="file" id="p" name="<%=name %>" size="20" /></td>
		</tr>
		<tr align="center">
			<td align="center" colspan="2">
				<input type="hidden" name="photo" value="<%=name %>"/>                            
				<input type="button" value="上传" onclick="checkFile()"/>
			</td>
		</tr>
	</table>
</form>

</body>
</html>

 web.xml

  <servlet>
  	<servlet-name>uploadServlet</servlet-name>
  	<servlet-class>com.ysj.controller.UploadServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>uploadServlet</servlet-name>
  	<url-pattern>/uploadServlet</url-pattern>
  </servlet-mapping>

 UploadServlet.java

package com.ysj.controller;

import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.ysj.model.UserManagerService;

public class UploadServlet extends HttpServlet {
	public void init(){}
	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException{
		this.doPost(request, response) ;
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException{
		request.setCharacterEncoding("UTF-8") ;
		response.setCharacterEncoding("UTF-8") ;
		//用于存放输出的信息
		String message = "" ;
		
		//在自己的项目中构造出一个用于存放用户照片的文件夹
		String projectpath = this.getServletContext().getRealPath("/images/") ;
		//如果此文件夹不存在,则构造此文件夹
		File f = new File(projectpath) ;
		if(!f.exists()){
			f.mkdir() ;
		}
		
		//构造出文件工厂,用于存放JSP页面中传递过来的文件
		DiskFileItemFactory factory = new DiskFileItemFactory() ;
		//设置缓存大小,如果文件大于缓存大小时,则先把文件放到缓存中
		factory.setSizeThreshold(4*1024) ;
		//设置上传文件的保存路径
		factory.setRepository(f) ;
	
		//产生Servlet上传对象
		ServletFileUpload upload = new ServletFileUpload(factory) ;
		//设置可以上传文件大小的上界4MB
		upload.setSizeMax(4*1024*1024);
		
		try {
			//取得所有上传文件的信息
			List<FileItem> list = upload.parseRequest(request) ;
			Iterator<FileItem> iter = list.iterator() ;
			while(iter.hasNext()){
				FileItem item = iter.next() ;
				//如果接收到的参数不是一个普通表单(例text等)的元素,那么执行下面代码
				if(!item.isFormField()){
					String fieldName = item.getFieldName() ;//获得此表单元素的name属性
					String fileName = item.getName() ;//获得文件的完整路径
					String contentType = item.getContentType() ;//获得文件类型
					long fileSize = item.getSize() ;//获得文件大小
					// 从文件的完整路径中截取出文件名
					fileName = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
					
					//判断是否有图片上传
					if(!("".equals(fileName))&&!(fileName==null)){
						
						//如果上传的文件不是图片,那么不上传
						String allImgExt = ".jpg|.jpeg|.gif|.bmp|.png|" ;
						String extName = fileName.substring(fileName.indexOf("."),fileName.length()) ;
						if(allImgExt.indexOf(extName+"|")==-1){
							message = "该文件类型不允许上传。请上传 "+allImgExt+" 类型的文件,当前文件类型为"+extName;
							break ;
						}
						
						String filepath = projectpath+"\\"+fieldName ;
						File uf = new File(filepath) ;
						//更改文件的保存路径,以防止文件重名的现象出现
						if(!uf.exists()){
							uf.mkdir() ;
						}
//此输出路径为保存到数据库中photo字段的路径
						String insertDB = filepath+"\\"+fileName ;
System.out.println("文件路径:"+insertDB+":"+insertDB.length());
						

						File uploadedFile = new File(filepath, fileName);

						
						try {
							//如果在该文件夹中已经有相同的文件,那么将其删除之后再重新创建(只适用于上传一张照片的情况)
							if(uploadedFile.exists()){
								uploadedFile.delete() ;
							}
							item.write(uploadedFile);
							
							UserManagerService userService = new UserManagerService() ;
							if(userService.getOperate().updatePhoto(fieldName, insertDB)){
								message = "上传文件成功<br/><br/>基本信息如下:<br/>文件名:"+fileName
										+"<br/>文件类型:"+contentType+"<br/>文件大小:"+fileSize;
							}
							
						} catch (Exception e) {
							e.printStackTrace();
							//return ;
						}
						
					}else { 
						// 取得普通的对象(对于像文本框这种类型的使用)
						// 对于普通类型的对象暂不做处理
						//return ;
					}
				}
			}
		} catch (FileUploadException e) {
			// TODO Auto-generated catch block
			message = "文件的内容过大,请上传小于4MB的文件" ;
			e.printStackTrace();
		}
		
		request.setAttribute("message", message) ;
		request.getRequestDispatcher("upload.jsp").forward(request, response) ;
	}	
	
	public void destroy(){}
}

 完毕!

有什么疑问可以给我留言,一天之内肯定解决。

你可能感兴趣的:(oracle,jsp,servlet,MyEclipse,Office)