基于JSP+Servlet+JavaBean的图片或文件上传
一、概述
现在不管是博客论坛还是企业办公,都离不开资源的共享。通过文件上传的方式,与大家同分享,从而达到大众间广泛的沟通和交流,我们既可以从中获得更多的知识和经验,也能通过他人的反馈达到自我改进和提升的目的。
下面我就为大家介绍 web项目中的这一上传功能,那么文件是如何从本地发送到服务器的呢?大家可以在在线视频课程进修学习《基于JSP+Servlet+JavaBean的人力资源管理系统开发》中第22课-项目开发-其它功能完善-图片上传,同时共享资料并提供相关答疑。
课程观看地址:http://www.xuetuwuyou.com/course/53,
讲师:蒋子厚http://www.xuetuwuyou.com/user/1984。
课程出自学途无忧网:http://www.xuetuwuyou.com
二、Servlet实现文件上传,需要添加第三方提供的jar包
1) commons-fileupload-1.2.2-bin.zip
首先,我们创建一个新的web工程,在工程的WebRoot目录下新建一个upload文件夹,这样当我们将该工程部署到服务器上时,服务器便也生成个upload文件夹,用来存放上传的资源。
三:文件上传的JSP文件要求和例子
表单提交方式必须是POST方式,
编码类型:enctype="multipart/form-data",
默认是 application/x-www-form-urlencoded
比如:<formaction="FileUpLoad"enctype="multipart/form-data"method="post">
然后,在WebRoot目录下新建一个jsp文件,主要实现的作用就是选择上传的文件,提交至servlet来进行处理详细代码如下:一个form将文件信息通过post方式传送到指定的servlet
JSP代码如下:
<%@ page language="java" import="java.util.*"pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN">
<html>
<body>
<%
String id = request.getParameter("id");
String username = request.getParameter("username");
%>
<table width="100%" border="0"cellpadding="0" cellspacing="0">
<tr>
<td width="17"valign="top" background="p_w_picpaths/mail_leftbg.gif"><imgsrc="p_w_picpaths/left-top-right.gif" width="17"height="29" /></td>
<td valign="top"background="p_w_picpaths/content-bg.gif"><tablewidth="100%" height="31" border="0"cellpadding="0" cellspacing="0"class="left_topbg" id="table2">
<tr>
<td height="31"><divclass="titlebt">员工相片上传</div></td>
</tr>
</table></td>
<td width="16"valign="top" background="p_w_picpaths/mail_rightbg.gif"><imgsrc="p_w_picpaths/nav-right-bg.gif" width="16"height="29" /></td>
</tr>
<tr>
<td valign="middle"background="p_w_picpaths/mail_leftbg.gif"> </td>
<td valign="top"bgcolor="#eef2f6">
<form action="FileUpLoad" method="post"enctype="multipart/form-data" name="form1">
<table width="100%"border="1" cellpadding="0" cellspacing="0"bordercolor="#a7c5ca">
<tr bgcolor="#c0dde3">
<th scope="col"width="25%"> </th>
<th scope="col"width="15%"> </th>
<th scope="col"width="35%"> </th>
<th scope="col"width="25%"> </th>
</tr>
<tr>
<td> </td>
<td>员工ID :</td>
<td><label>
<inputtype="text" name="id" value="<%=id %>">
</label></td>
<td> </td>
</tr>
<tr>
<td> </td>
<td>员工姓名:</td>
<td><label>
<inputtype="text" name="username" value="<%=username%>">
</label></td>
<td> </td>
</tr>
<tr>
<td> </td>
<td>员工相片:</td>
<td><label>
<inputtype="file" name="file1">
</label></td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td>
<label>
<inputtype="submit" name="Submit" value="提交">
</label>
</td>
<td> </td>
</tr>
</table>
</form>
</td>
<tdbackground="p_w_picpaths/mail_rightbg.gif"> </td>
</tr>
<tr>
<td valign="bottom"background="p_w_picpaths/mail_leftbg.gif"><imgsrc="p_w_picpaths/buttom_left2.gif" width="17"height="17" /></td>
<tdbackground="p_w_picpaths/buttom_bgs.gif"><imgsrc="p_w_picpaths/buttom_bgs.gif" width="17"height="17"></td>
<td valign="bottom"background="p_w_picpaths/mail_rightbg.gif"><imgsrc="p_w_picpaths/buttom_right2.gif" width="16"height="17" /></td>
</tr>
</table>
</body>
</html>
可以看到,我们将数据提交到工程下的FileUpLoad这个Servlet。 之后,我们就来编写这个Servlet:FileUpLoad.java
FileUpLoad.java代码如下:
package com.xtwy.hr.servlet;
import java.io.*;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.apache.commons.fileupload.FileItem;
importorg.apache.commons.fileupload.FileUploadException;
importorg.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import com.xtwy.hr.dao.UsersDao;
public class FileUpLoad extendsHttpServlet {
publicvoid doPost(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
request.setCharacterEncoding("utf-8");// 设置编码
Stringphotoname = null;
Stringid = null;
//获得磁盘文件条目工厂
DiskFileItemFactoryfactory = new DiskFileItemFactory();
//获取文件需要上传到的路径
Stringpath = request.getRealPath("/upload");
//如果没以下两行设置的话,上传大的文件会占用很多内存,
//设置暂时存放的存储室 , 这个存储室,可以和最终存储文件的目录不同
factory.setRepository(newFile(path));
//设置缓存的大小,当上传文件的容量超过该缓存时,直接放到暂时存储室
factory.setSizeThreshold(1024* 1024);
//高水平的API文件上传处理
ServletFileUploadupload = new ServletFileUpload(factory);
try{
//可以上传多个文件
List<FileItem>list = (List<FileItem>) upload.parseRequest(request);
for(FileItem item : list) {
Stringname = item.getFieldName(); // 获取表单的属性名字
if("id".equals(name)) {
id= item.getString();
}
//如果获取的表单信息是普通的文本信息
if(item.isFormField()) {
//获取用户具体输入的字符串,名字起得挺好,因为表单提交过来的是字符串类型的
Stringvalue = item.getString();
request.setAttribute(name,value);
}
//对传入的非简单的字符串进行处理,比如说二进制的图片,电影这些
else{
/**
* 以下三步,主要获取上传文件的名字
*/
//获取路径名
Stringvalue = item.getName();
//索引到最后一个反斜杠
intstart = value.lastIndexOf("\\");
//截取上传文件的字符串名字,加1是去掉反斜杠,
Stringfilename = value.substring(start + 1);
if("file1".equals(name)) {
photoname= filename;
}
request.setAttribute(name,filename);
OutputStreamout = new FileOutputStream(new File(path,
filename));
InputStreamin = item.getInputStream();
intlength = 0;
byte[]buf = new byte[1024];
System.out.println("获取上传文件的总共的容量:" + item.getSize());
//in.read(buf) 每次读到的数据存放在 buf 数组中
while((length = in.read(buf)) != -1) {
//在 buf 数组中取出数据写到(输出流)磁盘上
out.write(buf,0, length);
}
in.close();
out.close();
}
}
}catch (FileUploadException e) {
e.printStackTrace();
}catch (Exception e) {
}
UsersDaouserdao = new UsersDao();
userdao.updatePhotoById(Integer.parseInt(id),photoname);
Listlist1 = null;
list1= userdao.selectuserById(Integer.parseInt(id));
request.setAttribute("userlist",list1);
request.getRequestDispatcher("userview.jsp").forward(request,response);
}
}
因为已对代码做了详细的注释,所以相信大家也能基本上传的这个过程。此外,也可以读取选择文件的后缀来筛选出可以上传的类型,需要更加复杂业务操作处理的,可以在Servlet进行修改和调用相关的JavaBean封装类。这些代码大家自己扩展,不再细谈。
上传结束之后,使页面转到上传成功页面userview.jsp进行查看。 当用户看到此页面时,说明你已实现文件的上传功能。