JSP页面上传文件到服务器(转)

当我们在 HTML 表单中选择本地文件之后点击“提交”按钮则会将文件上传到服务器中,此时该 HTTP 请求正文的数据类型就是 multipart/form-data 型的。而在 Servlet 技术中,该 HTTP 请求会被 Servlet 容器(如 Tomcat)包装成 HttpServletRequest 对象,再由端所请求的相应 Servlet 进行处理。
但是,如果此时我们在服务器端编写的 Servlet 一点点地解析这个 HTTP 请求,分离出其中的文本表单和上传的文件类型,这未免有点低效。于是,我们可以使用 Apache 开源上传软件包 fileupload 来简化这一过程,直接使用即可。下载地址:http://commons.apache.org/fileupload/
在 fileupload 包中, HTTP 请求中的复杂表单元素都被看做一个 FileItem 对象;FileItem 对象必须由 ServletFileUpload 类中的 parseRequest() 方法解析 HTTP 请求(即被包装之后的 HttpServletRequest 对象)出来,即分离出具体的文本表单和上传文件;而 ServletFileUpload 对象的创建需要依赖于 FileItemFactory 工厂将获得的上传文件 FileItem 对象保存至服务器硬盘,即 DiskFileItem 对象。
呼…把这个 fileupload 包中的关系讲得那么乱,最好还是自己看下载下来的帮助文档。不过,推荐一个免费的 Java 反编译器 JD-GUI ,用它能够很轻松地打开 .jar 文件,除了源代码中的注释,其他的一览无遗,很好用啊。下载地址:http://java.decompiler.free.fr/?q=jdgui
好吧,我们的程序要求:
1、提供一个 HTML 文件,用户可在相应表单中选择需要上传的文件;
2、编写一个名叫 UploadServlet 的Servlet 文件,主要功能是解析上面 HTML 表单所提交的 HTTP 请求,把普通的文本域和文件域分离开来;
3、UploadServlet 根据 web.xml 配置文件中的初始化参数确定好需要在 Web 服务器存放该文件的目录,将上传的文件写入到该存放目录中,在我的这里我把上传的文件保存到 F:\java\JavaWeb\ch05\uploadFile 目录中,而 F:\java\JavaWeb\ch05\temp 目录则用作该 Web 应用的临时目录。
程序代码:
upload.html 文件
<html> 
<head> <title>Servlet 上传文件</title></head>
<body >
<form name="uploadForm" method="POST"
enctype="MULTIPART/FORM-DATA"
action="upload">

User Name:<input type="text" name="username" size="30"/>
Upload File1:<input type="file" name="file1" size="30"/>
Upload File2:<input type="file" name="file2" size="30"/>
<input type="submit" name="submit" value="上传">
<input type="reset" name="reset" value="重置">
</form>
</body>
</html>

保存文件do_upload3.jsp(保存文件名到数据库)
<%@ page contentType="text/html; charset=utf-8" %>
<%@ page import="java.util.*"%>
<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
<%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
<%@ page import="org.apache.commons.fileupload.FileItem"%>
<%@ page import="java.io.File"%>
<%@ page import="java.io.IOException"%>
<%@ page import="org.apache.commons.io.output.DeferredFileOutputStream"%>
<%@ page import="java.text.SimpleDateFormat"%>
<%@page import="com.mysql.jdbc.Driver"%>
<%@page import="java.sql.*"%>
<%@page import="com.mysql.jdbc.ResultSetMetaData"%>

<html>
<head>
<title>保存上传文件</title>
</head>
<%
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024*1024); //设置缓存大小,单位KB
String path = request.getRealPath("/images"); //得到当前项目upload目录的绝对路径
factory.setRepository(new File(path)); //设置文件临时存储路径为path
ServletFileUpload upload = new ServletFileUpload(factory);
String fileName=null;
try {
List<FileItem> list = upload.parseRequest(request);
for(FileItem item : list){
//如果item是普通表单字段
if(item.isFormField()){
String name = item.getFieldName(); //得到表单字段的name属性值
String value = item.getString("gbk"); //得到表单字段值,编码采用gbk
request.setAttribute(name, value);
}else
{
String name = item.getFieldName();
String value = item.getName(); //得到上传文件的路径(根据浏览器不同可能会有所差异)
int start = value.lastIndexOf("\\");
fileName = value.substring(start+1); //截取最后一个\之后的字符,即行到上传文件名
request.setAttribute(name, fileName);

item.write(new File(path,fileName)); //在硬盘上写入文件
}
}
String driverName = "com.mysql.jdbc.Driver"; //驱动名称
String DBUser = "root"; //mysql用户名
String DBPasswd = "admin"; //mysql密码
String DBName = "healthlportal610"; //数据库名

//数据库完整链接地址
String connUrl = "jdbc:mysql://localhost/" + DBName + "?user="
+ DBUser + "&password=" + DBPasswd+"&useUnicode=true&characterEncoding=utf8";

//加载数据库驱动
Class.forName(driverName).newInstance();

//链接数据库并保存到 conn 变量中
Connection conn = DriverManager.getConnection(connUrl);

//申明~?
Statement stmt = conn.createStatement();

//设置字符集
// stmt.executeQuery("SET NAMES 'gb2312'");
//SmartUpload su = new SmartUpload();


/*Cookie myCookie[]=request.getCookies();//创建一个Cookie对象数组
for(int n=0;n=myCookie.length-1;n++)//设立一个循环,来访问Cookie对象数组的每一个元素
Cookie newCookie= myCookie[n];
if(newCookie.getName().equals("num")); //判断元素的值是否为username中的值
{
str2= newCookie.getValue();//如果找到后,向他问好
}*/




String sql =null;

sql = "INSERT INTO railway_assess(jieche) VALUES('"+fileName+"')";

//取得结果
stmt.executeUpdate(sql);



//out.print(sql);

//要执行的 sql 查询


/** 关闭连接 **/

conn.close();
stmt.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
%>

</body>
</html>


UploadServlet.java 文件
import javax.servlet.*;  
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import org.apache.commons.fileupload.*;
import org.apache.commons.fileupload.servlet.*;
import org.apache.commons.fileupload.disk.*;

// Servlet 文件上传
public class UploadServlet extends HttpServlet
{
private String filePath; // 文件存放目录
private String tempPath; // 临时文件目录

// 初始化
public void init(ServletConfig config) throws ServletException
{
super.init(config);
// 从配置文件中获得初始化参数
filePath = config.getInitParameter("filepath");
tempPath = config.getInitParameter("temppath");

ServletContext context = getServletContext();

filePath = context.getRealPath(filePath);
tempPath = context.getRealPath(tempPath);
System.out.println("文件存放目录、临时文件目录准备完毕 ...");
}

// doPost
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException
{
res.setContentType("text/plain;charset=gbk");
PrintWriter pw = res.getWriter();
try{
DiskFileItemFactory diskFactory = new DiskFileItemFactory();
// threshold 极限、临界值,即硬盘缓存 1M
diskFactory.setSizeThreshold(4 * 1024);
// repository 贮藏室,即临时文件目录
diskFactory.setRepository(new File(tempPath));

ServletFileUpload upload = new ServletFileUpload(diskFactory);
// 设置允许上传的最大文件大小 4M
upload.setSizeMax(4 * 1024 * 1024);
// 解析HTTP请求消息头
List fileItems = upload.parseRequest(req);
Iterator iter = fileItems.iterator();
while(iter.hasNext())
{
FileItem item = (FileItem)iter.next();
if(item.isFormField())
{
System.out.println("处理表单内容 ...");
processFormField(item, pw);
}else{
System.out.println("处理上传的文件 ...");
processUploadFile(item, pw);
}
}// end while()

pw.close();
}catch(Exception e){
System.out.println("使用 fileupload 包时发生异常 ...");
e.printStackTrace();
}// end try ... catch ...
}// end doPost()


// 处理表单内容
private void processFormField(FileItem item, PrintWriter pw)
throws Exception
{
String name = item.getFieldName();
String value = item.getString();
pw.println(name + " : " + value + "\r\n");
}

// 处理上传的文件
private void processUploadFile(FileItem item, PrintWriter pw)
throws Exception
{
// 此时的文件名包含了完整的路径,得注意加工一下
String filename = item.getName();
System.out.println("完整的文件名:" + filename);
int index = filename.lastIndexOf("\\");
filename = filename.substring(index + 1, filename.length());

long fileSize = item.getSize();

if("".equals(filename) && fileSize == 0)
{
System.out.println("文件名为空 ...");
return;
}

File uploadFile = new File(filePath + "/" + filename);
item.write(uploadFile);
pw.println(filename + " 文件保存完毕 ...");
pw.println("文件大小为 :" + fileSize + "\r\n");
}

// doGet
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException
{
doPost(req, res);
}
}
web.xml 文件
<?xml version="1.0" encoding="gb2312"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">

<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>UploadServlet</servlet-class>

<init-param>
<param-name>filepath</param-name>
<param-value>uploadFile</param-value>
</init-param>
<init-param>
<param-name>temppath</param-name>
<param-value>temp</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>

</web-app>


程序运行过程截图:(在 web.xml 文件中我们把UploadServlet 映射为 upload)
1、启动 Tomcat ,在浏览器输入 URL 并填写 HTML 表单,如下:

2、点击“上传”,发出一个包含了上传文件的复杂 HTTP 请求,由 UploadServlet 进行处理:
先看下 Tomcat 的控制台输出信息:

再看一下浏览器的相应输出:

最后看上传的文件是否被被保存在指定的目录中:

嗯,文件目录和文件保存时间都正确,就是文件大小忘了转化一下…(*^__^*) …
小结:
1、使用开源的 fileupload 包为我们在 UploadServlet 代码中显式地用繁杂的 request.getParameter(“username”) 语句来获取 HTTP 请求所包含的表单值;
2、而且还省去了我们在 UploadServlet 中自己编写判断表单是否是文件或文本类型的代码;
3、更重要的是,FileItem 对象的响应方法可以使得我们轻松地获取文件名、文件大小、路径等等;
4、最重要的是,使用 JD-GUI 反编译器简单地看看开源的 fileupload 包中的类组织结构,这更加有意思、有用处,:-D
本文出自 “蚂蚁” 博客,请务必保留此出处http://haolloyin.blog.51cto.com/1177454/368162[b][b][/b][/b]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值