`

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(){}
}

 完毕!

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

9
0
分享到:
评论
20 楼 ysj5125094 2015-04-21  
东来东去 写道
你好,在jsp代码中70行 String name=user.getName()是干什么用的,我的找不到这个方法


在Model下面有个UserBean类,相当于从session中取出个user对象。
19 楼 东来东去 2015-04-14  
你好,在jsp代码中70行 String name=user.getName()是干什么用的,我的找不到这个方法
18 楼 ysj5125094 2012-09-21  
1028156461pan 写道
UserManagerService userService = new UserManagerService() ;这个类包是实现什么的?你好,您这个工程的具体页面流程是怎样的呢

UserManagerService这个类的原代码已经在附件中包含了,就是这个UserManagerSystem_3.0.rar.具体页面的流程你可以把我的代码贴到自己的工程下面跑一下就知道了.
17 楼 ysj5125094 2012-09-21  
1028156461pan 写道
你好,请问您能把那个CSS样式的改成表单的嘛?对CSS样式不是很熟

你完全可以不加CSS样式嘛,把CSS删掉,对程序没有任何影响的,呵呵.
16 楼 1028156461pan 2012-09-13  
UserManagerService userService = new UserManagerService() ;这个类包是实现什么的?你好,您这个工程的具体页面流程是怎样的呢
15 楼 1028156461pan 2012-09-13  
你好,请问您能把那个CSS样式的改成表单的嘛?对CSS样式不是很熟
14 楼 lh870003574 2012-05-30  
牛~~~~
13 楼 ysj5125094 2012-04-08  
yys0706 写道
可不可以再写一篇把添加文件路径写入数据库,再从数据库调用的,实现文件下载功能的。。

恩,这个应该不是很难吧,呵呵.现在项目比较忙,看看什么时候有时间再添加这个功能吧.呵呵.
12 楼 yys0706 2012-03-28  
可不可以再写一篇把添加文件路径写入数据库,再从数据库调用的,实现文件下载功能的。。
11 楼 ysj5125094 2011-04-14  
花岗岩 写道
再写一篇把添加文件路径写入数据库,再从数据库调用的呗。。。


我以前还真做过这样的例子,等过一阵子有时间了,我传上来,你注意看一下.
10 楼 ysj5125094 2011-04-14  
花岗岩 写道
yuhu521fy 写道
UserManagerService userService = new UserManagerService() ; 这个service类中的方法是怎样的??

这个类包里是什么?求解


已经传上去了.
9 楼 ysj5125094 2011-04-14  
yuhu521fy 写道
UserManagerService userService = new UserManagerService() ; 这个service类中的方法是怎样的??

不好意思,那天上传的匆忙,没传我整个的工程,我现在把我以前做过的一个小例子传上去,你有时间可以看一下.
8 楼 花岗岩 2011-04-12  
yuhu521fy 写道
UserManagerService userService = new UserManagerService() ; 这个service类中的方法是怎样的??

这个类包里是什么?求解
7 楼 花岗岩 2011-04-11  
再写一篇把添加文件路径写入数据库,再从数据库调用的呗。。。
6 楼 花岗岩 2011-04-11  
我自己也在从头填写一个网站,感觉写的挺好
5 楼 yuhu521fy 2011-04-09  
UserManagerService userService = new UserManagerService() ; 这个service类中的方法是怎样的??
4 楼 ysj5125094 2010-11-08  
justice_jl 写道
O(∩_∩)O~,还行,还挺聪明的说,就是 简单的登录和增删改查,我先自己研究研究,呵呵,哎,自己的破机器,太卡了,开了MYECLIPSE,ORACLE,FIREFOX,基本就啥都干不了了,我OFFICE 还是2007的……超卡,本身就一身漏洞,呵呵,所以挺闹心的,我看看还是在A9学吧,到时候遇到问题了,再M你的说,O(∩_∩)O~

引用

恩,好的,有事儿您请话,哈哈。
3 楼 justice_jl 2010-11-08  
O(∩_∩)O~,还行,还挺聪明的说,就是 简单的登录和增删改查,我先自己研究研究,呵呵,哎,自己的破机器,太卡了,开了MYECLIPSE,ORACLE,FIREFOX,基本就啥都干不了了,我OFFICE 还是2007的……超卡,本身就一身漏洞,呵呵,所以挺闹心的,我看看还是在A9学吧,到时候遇到问题了,再M你的说,O(∩_∩)O~
2 楼 ysj5125094 2010-11-07  
justice_jl 写道
老剑,猜猜我是谁的说?改天给我讲讲哈,我看你弄的挺好!

引用

你是龙呗,嘿嘿,早就猜到了。你让我给你讲讲啥啊?会的一定全部告诉你。
1 楼 justice_jl 2010-11-07  
老剑,猜猜我是谁的说?改天给我讲讲哈,我看你弄的挺好!

相关推荐

Global site tag (gtag.js) - Google Analytics