★●Java程序员必须掌握的框架—Struts●★ 7.1.3
通过Common-FileUpload框架实现文件上传现在来看如何通过Common-FileUpload框架实现文件上传。
步骤如下。
(1)新建用户输入页upload.jsp。该页面仅仅包含一个表单,用来输入用户名以及选择用来上传的文件。这里需要注意两点:第一点是在于form表单的method属性必须为post,即设置表单的提交方式为POST方式;第二点必须设置form表单的enctype属性为multipart/form-data,这样才会以二进制流的方式来处理表单数据,从而完成文件的上传。enctype属性的默认值为application/x-www-form-urlencoded,这样的编码格式会将表单处理成URL编码格式。
<%@ page language="java" pageEncoding="gb2312"%>
<html>
<head>
<title>文件上传</title>
</head>
<center>
<h1>通过Common-FileUpload框架完成上传</h1>
<form action="UploadServlet" method="post" enctype="multipart/form-data">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username" ></td>
</tr>
<tr>
<td>上传文件:</td>
<td><input type="file" name="myFile"></td>
</tr>
<tr>
<td><input type="submit" value="上传"></td>
<td><input type="reset"></td>
</tr>
</table>
</form>
</center>
<body>
</body>
</html>
(2)新建Servlet用来处理上传。重点在于对表单域的判断,判断该表单域是一个普通的表单域还是文件域。如果是普通表单域则取得其表单域的name属性值和value属性,这个相当于传递参数中的参数与参数值。如果是文件表单域则取得该文件表单域的name属性值和上传文件名,并将该文件保存到设置的上传文件目录中。完成文件上传后,跳转页面到结果输出页。
package net.hncu.upload;
import java.io.File;
import java.io.IOException;
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;
public class UploadServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//新建上传工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置文件大小限制。
//如果小于该文件限制,则文件直接保存在内存中如何保存到目标文件夹中。
//如果大于该文件限制,则文件将保存到设置的临时目录中。
factory.setSizeThreshold(1024 * 1024);
//设置临时目录
factory.setRepository(new File(getServletContext().getRealPath("/temp")));
//实例化一个ServletFileUpload对象用来上传
ServletFileUpload sfu = new ServletFileUpload(factory);
//得到所有的表单项
List<FileItem>
all = null;
try {
all = sfu.parseRequest(request);
} catch (FileUploadException e) {
e.printStackTrace();
}
for(FileItem item : all) {
//如果是普通表单字段
if(item.isFormField()) {
//获得该字段名称
String name = item.getFieldName();
//获得该字段值
String value = item.getString("gbk");
//将值设置到request属性范围中
request.setAttribute(name, value);
}
//如果为文件域
else {
//取得文件域字段名
String name = item.getFieldName();
//取得文件名
String value = item.getName();
//截取文件名
int begin = value.lastIndexOf("\\");
value = value.substring(begin + 1);
//将值设置到request属性范围中
request.setAttribute(name, value);
//设置上传文件目录
String uploadPath = getServletContext().getRealPath("/upload");
//写入文件
try {
item.write(new File(uploadPath,value));
} catch (Exception e) {
e.printStackTrace();
}
}
}
//上传完成后执行跳转
request.getRequestDispatcher("/result.jsp").forward(request, response);
}
}
(3)配置文件上传Servlet。
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
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">
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>net.hncu.upload.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
</web-app>
(4)新建结果输出页result.jsp。在该页面中输出用户的用户名以及上传的文件名。
<%@ page language="java" pageEncoding="gb2312"%>
<html>
<head>
<title>文件上传</title>
</head>
<center>
<h1>通过Common-FileUpload框架完成上传</h1>
用户名:${requestScope.username}<br>
上传文件名:${requestScope.myFile }
</center>
<body>
</body>
</html>
以上内容节选自 机械出版社 《零基础学struts》
本书的销售网址是http://product.dangdang.com/product.aspx?product_id=20511367
技术讨论交流网址http://www.rzchina.net/
![]()
[img] http://www.huachu.com.cn/itbook/itbookinfo.asp?lbbh=10073053 [/img]
|