利用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="上传" οnclick="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(){}
}
完毕!
有什么疑问可以给我留言,一天之内肯定解决。