所需包:commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar 工作需要,以前都是直接用struts框架中的上传组件,很好用,但是现在没有用框架了,只用jsp上传还不会了,现在学习了一下,做好备份,希望下次能用的上。 前台页面不用多说 主要是表单中设置 enctype="multipart/form-data" 很重要。 处理上传jsp文件
//判断表单是否是Multipart类型的。这里可以直接对request进行判断
if (ServletFileUpload.isMultipartContent(request)) {
// 创建文件处理工厂,它用于生成 FileItem 对象。
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置文件的缓存路径
String tempdir =this.getServletContext().getRealPath("/upload/temp");
java.io.File d = new java.io.File(savedir);
if(!d.exists()){
d.mkdirs();
}
factory.setSizeThreshold(1024*1024); // 设置最多只允许在内存中存储的数据,单位:字节
factory.setRepository(d); // 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录(默认可以不用设置)
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置允许用户上传文件大小,单位:字节
upload.setSizeMax(yourMaxRequestSize);
//上传文件,并解析出所有的表单字段,包括普通字段和文件字段
List items = upload.parseRequest(request);
//下面对每个字段进行处理,分普通字段和文件字段
Iterator it = items.iterator();
while(it.hasNext()){
FileItem fileItem = (FileItem) it.next();
//如果是普通字段
if(fileItem.isFormField()){ //是普通的字段
System.out.println(fileItem.getFieldName() + " " + fileItem.getName() + " " + new String(fileItem.getString().getBytes("iso8859-1"), "gbk"));
fileItem.getFieldName();//得到字段name属性的值
fileItem.getName();//得到file字段的文件名全路径名,如果不是file字段,为null
fileItem.getString();//得到该字段的值,默认的编码格式
fileItem.getString("UTF-8");//指定编码格式
}else{//文件字段
System.out.println(fileItem.getFieldName() + " " +
fileItem.getName() + " " +//得到file字段的文件名全路径名
fileItem.isInMemory() + " " +//用来判断FileItem类对象封装的主体内容是存储在内存中,还是存储在临时文件中,如果存储在内存中则返回true,否则返回false
fileItem.getContentType() + " " +//文件类型
fileItem.getSize()); //文件大小
//什么东西都有了 ,想怎么处理都可以了
//保存文件,其实就是把缓存里的数据写到目标路径下
if(fileItem.getName()!=null && fileItem.getSize()!=0){
File fullFile = new File(fileItem.getName());
File newFile = new File("c:/temp/" + fullFile.getName());
try {
fileItem.write(newFile);
} catch (Exception e) {
e.printStackTrace();
}
}else{
System.out.println("文件没有选择 或 文件内容为空");
}
另转:
如果 enctype 类型为 multipart/form-data 的话,使用 request.getParameter 是得不到数据的。
你已经使用 FileUpload,那就肯定获得了 org.apache.commons.fileupload.servlet.ServletFileUpload 对象。通过 List<FileItem> fileItems = fileUpload.parseRequest(request) 获得 List<FileItem> 集合。
遍历这个集合,在 FileItem 中有 isFormField 方法,如果为 true 表示是字段值,否则就是文件域。
使用 FileItem#getFieldName() 获得 form 表单中的各控件的 name,
FileItem#getString 获得非文件域的值。
如果是文件域,使用 FileItem#get() 获得上传文件的字节数组,
FileItem#getContentType() 获得上传的文件类型,
FileItem#getSize() 获得文件大小,
FileItem#getName() 获得上传的原始文件名。
在这里。我们将要描述fileupload的基本使用方法,然后解释一些更简单的,以及最常用的使用模式。fileupload的个性化在这里得到了描述。
//检查是否是一个文件上传请求
boolean isMultipart = FileUpload.isMultipartContent(request);
--------------------------------------------------------------------------------
比较大的文件上传选项必须写入到磁盘的临时文件中去;
大文件上传请求必须不被允许;
默认的驻留内存的选项的最大大小,最大允许的上传文件请求,和临时文件的存储地方是可以接受的;
在这种情景下处理这样一个请求并不是很简单的:
--------------------------------------------------------------------------------
DiskFileUpload upload = new DiskFileUpload();
//解析请求
List /* FileItem */ items = upload.parseRequest(request);
--------------------------------------------------------------------------------
解析的结果是一个文件项目的List,每一个都实现了FileItem接口。处理这些项目将在下面讨论。
--------------------------------------------------------------------------------
//创建一个新的文件上传句柄
DiskFileUpload upload = new DiskFileUpload();
//设置上传参数
upload.setSizeThrehold(最大内存大小);
upload.setSizeMax(最大请求大小);
upload.setRepositoryPath(临时目录);
//解析请求
List /* FileItem */ items = upload.parseRequest(request);
当然,每个配置方法都是独立于其它的,但是如果你想一次就配置它们,你可以使用可选的parseRequest()方法,像这样:
// 建立一个新的文件上传句柄
DiskFileUpload upload = new DiskFileUpload();
// 解析请求
List /* FileItem */ items = upload.parseRequest(request,
内存大小, 允许上传的最大文件, 临时目录);
如果你想更多地控制请求的解析,比如把上传选项存储到其它地方,例如,存到数据库中-你可以参照自定义FileUpload。
处理上传选项
一旦解析过程完毕,你就可以获得一个文件选项的List,以便进一步处理。在大多数情况下,你将会根据规则的表单域来不同地处理文件的上传。所以你可能以这样的方式来处理:
// 处理上传的选项
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) {
processFormField(item);
} else {
processUploadedFile(item);
}
}
对于一个规则的表单域来说,你对它感兴趣的可能就只有它的名字以及它的字符串值。你也会想到,处理它们是简单的:
//处理一个规则表单域
if (item.isFormField()) {
String name = item.getFieldName();
String value = item.getString();
...
}
而对于一个文件的上传,在你处理它的内容之前,可以有好多令你想知道的不同的东西,这里有一个采用了一些你可能感兴趣的方法的例子
// 处理一个文件上传
if (!item.isFormField()) {
String fieldName = item.getFieldName();
String fileName = item.getName();
String contentType = item.getContentType();
boolean isInMemory = item.isInMemory();
long sizeInBytes = item.getSize();
...
}
对于这些上传的文件,你一般不想通过内存来存取它们,除非它们很小,或者你没有其它好的方法,更进一步,你想将内容当作文件流来处理,或者将整个文件写到最终的地址。FileUpload提供了简单的方法来完成这些 操作。
// 处理一个文件上传的情况
if (writeToFile) {
File uploadedFile = new File(...);
item.write(uploadedFile);
} else {
InputStream uploadedStream = item.getInputStream();
...
uploadedStream.close();
}
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
// 在内存中处理一个上传的文件
byte[] data = item.get();
...
应用,这个已经超出了本文档的讨论范围。
下一步是什么
希望这个页面能提供给你一个好的意见,让你在你自己的应用中能使用FileUpload。更多关于这里介绍的方法,以及其它可用的方法,你可以参照api文档。这里介绍的用法已经可以满足大多数的文件上传的需要了,当然,如果你还有更多的复杂的需求,使用它的灵活的自定义配置的能力,FileUpload一定可以能够帮助你。
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Upload Page</title>
</head>
<body>
<!-- 必须写 enctype="multipart/form-data" !!! -->
<form method="post" action="upload" style=" text-align: center" enctype="multipart/form-data">
<input type="file" name="file1"><br>
<input type="file" name="file2"><br>
<input type="file" name="file3"><br>
<input type="submit" name="submit">
</form>
</body>
</html>
web.xml
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>UpLoadAction</servlet-name>
<servlet-class>com.hygj.furong.servlet.UpLoadAction</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UpLoadAction</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>
UpLoadAction.java
package com.hygj.furong.servlet;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
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.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UpLoadAction extends HttpServlet {
/**
* Destruction of the servlet. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to
* post.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置长传文件的最大值:5M
final long MAX_SIZE = 5 * 1024 * 1024;
// 设置允许上传文件格式的列表
final String[] allowedExt = new String[] { "jpg", "jpeg", "gif", "txt",
"doc", "docx", "mp3", "wma", "m4a", "rar" };
response.setContentType("text/html");
// 字符编码为UTF-8
response.setCharacterEncoding("UTF-8");
// 实例化一个硬盘文件工厂,用来配置文件组建ServletFileUpload
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置长传文件时用于临时存放文件的内存大小,这里是4K,多余的部分将临时存在硬盘
factory.setSizeThreshold(4096);
// 设置存放临时文件的目录,web根目录下的UploadTemp目录
factory
.setRepository(new File(request.getRealPath("/") + "UploadTemp"));
/**
* 用以上工厂实例化长传组件
*/
ServletFileUpload sfu = new ServletFileUpload(factory);
// 设置最大上传尺寸
sfu.setSizeMax(MAX_SIZE);
PrintWriter out = response.getWriter();
// 从request得到 所有 上传域的列表
List fileList = null;
try {
fileList = sfu.parseRequest(request);
} catch (Exception e) {
// 处理文件尺寸过大异常
if (e instanceof SizeLimitExceededException) {
out.println("文件尺寸超过规定大小:" + MAX_SIZE + "字节<p />");
out.println("<a href=\"index.jsp\">返回</a>");
return;
}
System.out.println(e.getMessage());
}
// 没有文件长传
if (fileList == null || fileList.size() == 0) {
out.println("请选择文件上传--没有文件长传");
out.println("<a href=\"index.jsp\">返回</a>");
return;
}
// 得到所有上传的文件
Iterator fileItr = fileList.iterator();
// 循环处理所有文件
while (fileItr.hasNext()) {
FileItem fileItem = null;
String path = "";
long size = 0;
// 获取当前文件
fileItem = (FileItem) fileItr.next();
// 忽略简单form字段 而不是 上传域的文件域(<input type="text" />等)
if (fileItem == null || fileItem.isFormField()) {
continue;
}
// 获取文件的完整路径
path = fileItem.getName();
// 获取文件大小
size = fileItem.getSize();
if ("".equals(path) || size == 0) {
out.println("请选择文件上传--大小为0");
out.println("<a href=\"index.jsp\">返回</a>");
return;
}
// 得到去除路径的文件名
String realName = path.substring(path.lastIndexOf("\\") + 1);
// 得到文件的拓展名(无拓展名时将得到全名)
String extName = realName.substring(realName.lastIndexOf(".") + 1);
// 拒绝接收规定文件格式之外的文件类型
int allowFlag = 0;
int allowedExtCount = allowedExt.length;
for (; allowFlag < allowedExtCount; allowFlag++) {
if (allowedExt[allowFlag].equals(extName)) {
break;
}
}
if (allowFlag == allowedExtCount) {
out.println("请上传一下类型的文件");
for (allowedExtCount = 0; allowFlag < allowedExtCount; allowFlag++) {
out.println("*" + allowedExt[allowFlag]
+ " ");
}
out.println("<a href=\"index.jsp\">返回</a>");
return;
}
long now = System.currentTimeMillis();
// 根据系统时间生成上传够保存的文件名
String prefix = String.valueOf(now);
// 保存的最终文件完整路径,保存在web根目录下的UploadFile目录下
String finalName = request.getRealPath("/") + "/UploadFile/"
+ prefix + "." + extName;
try {
// 保存文件
fileItem.write(new File(finalName));
out.println("文件上传成功. 路径:"+request.getRealPath("/")+ "/UploadFile目录下 "+" 以保存为:" + prefix + "." + extName
+ " 文件大小:" + size + "字节<br>");
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
out.println("<a href=\"index.jsp\">继续上传</a>");
}
/**
* Initialization of the servlet. <br>
*
* @throws ServletException
* if an error occure
*/
public void init() throws ServletException {
// Put your code here
}
}