使用common-fileupload组建实现文件上传下载功能, 封装了一个WebFileService的类
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
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.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* <p>Title: 处理文件上传下载的类</p>
* <p>Description:
* 通过设置long MAX_SIZE可以设置上传文件的大小限制
* 通过设置String[] allowedExt设置允许上传的文件类型
* 通过Map parameters获得表单域的信息
* 通过List fileInfoList获取上传的每个文件的详细信息
* </p>
* <p>Copyright: Copyright (c) 2006, 2008 Royzhou Corporation.All rights reserved. </p>
* @author royzhou
* 2009-02-20
*/
public class FileWebService {
/**
* 表单域的信息
*/
private Map parameters = null;
/**
* 文件域的详细信息
*/
private List fileInfoList = null;
/**
* 允许上传的文件大小
*/
private long MAX_SIZE = 10*1024*1024;
/**
* 允许上传的文件类型
*/
private String[] allowedExt = new String[] { "jpg", "jpeg", "gif", "txt","doc", "docx", "mp3", "wma", "m4a" };
public FileWebService() {
parameters = new HashMap();
fileInfoList = new ArrayList();
}
/**
* @param request
* @param response
* @param path 用户设置的保存路径
* 上传文件并获取表单域及文件域的详细信息
* @throws Exception
*/
public void upload(HttpServletRequest request, HttpServletResponse response, String path) throws Exception {
/**
* 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload
*/
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
diskFileItemFactory.setSizeThreshold(4096);// 设置上传文件时用于临时存放文件的内存大小,这里是4K.多于的部分将临时存在硬盘
/**
* 采用系统临时文件目录作为上传的临时目录
*/
File tempfile = new File(System.getProperty("java.io.tmpdir"));
diskFileItemFactory.setRepository(tempfile);
/**
* 用以上工厂实例化上传组件
* 设置最大上传尺寸
*/
ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
fileUpload.setSizeMax(MAX_SIZE);
/**
* 调用FileUpload.settingHeaderEncoding(”UTF-8″),这项设置可以解决路径或者文件名为乱码的问题。
* 设置输出字符集
*/
fileUpload.setHeaderEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
/**
* 从request得到 所有 上传域的列表
*/
List fileList = null;
try {
fileList = fileUpload.parseRequest(request);
} catch (FileUploadException e) {
if (e instanceof SizeLimitExceededException) {
/**
* 文件大小超出限制
*/
out.println("文件尺寸超过规定大小:" + MAX_SIZE + "字节<p />");
out.println("<a href=\"upload.html\" target=\"_top\">返回</a>");
return;
}
e.printStackTrace();
}
/**
* 没有上传文件
*/
if (fileList == null || fileList.size() == 0) {
out.println("请选择上传文件<p />");
out.println("<a href=\"upload.html\" target=\"_top\">返回</a>");
return;
}
/**
* 得到所有上传的文件
* 对文件域操作
* 并保存每个文件的详细信息
*/
Iterator fileItr = fileList.iterator();
Map fileInfo = null;
while (fileItr.hasNext()) {
FileItem fileItem = null;
long size = 0;
String userPath = null;
String serverPath = null;
String fileName = null;
String fileExt = null;
fileItem = (FileItem) fileItr.next();
/**
* 忽略简单form字段而不是上传域的文件域(<input type="text" />等)
*/
if (!fileItem.isFormField()) {
/**
* 得到文件的详细信息
* 客户端完整路径:userPath
* 服务器端完整路径:serverPath
* 大小:size
* 文件名:fileName
* 扩展名:fileExt
*
*/
userPath = fileItem.getName();
size = fileItem.getSize();
if ("".equals(userPath) || size == 0) {
out.println("请选择上传文件<p />");
out.println("<a href=\"upload.html\" target=\"_top\">返回</a>");
return;
}
fileName = userPath.substring(userPath.lastIndexOf("\\") + 1);
fileExt = fileName.substring(fileName.lastIndexOf(".") + 1);
/**
* 文件类型是否合法
*/
int allowFlag = 0;
int allowedExtCount = allowedExt.length;
for (; allowFlag < allowedExtCount; allowFlag++) {
if (allowedExt[allowFlag].toLowerCase().equals(fileExt.toLowerCase()))
break;
}
if (allowFlag == allowedExtCount) {
out.println("请上传以下类型的文件<p />");
for (allowFlag = 0; allowFlag < allowedExtCount; allowFlag++)
out.println("*." + allowedExt[allowFlag].toLowerCase()
+ " ");
out
.println("<p /><a href=\"upload.html\" target=\"_top\">返回</a>");
return;
}
/**
* 根据系统时间生成上传后保存的文件名
*/
serverPath = path + System.currentTimeMillis() + "." + fileExt;
try {
/**
* 保存文件
*/
File diskPath = new File(path);
if(!diskPath.exists()) {
diskPath.mkdirs();
}
File diskFile = new File(serverPath);
if(!diskFile.exists()) {
diskFile.createNewFile();
}
fileItem.write(diskFile);
out.println("文件上传成功. 已保存为: " + serverPath
+ " 文件大小: " + size + "字节<p />");
out.println("<form action=\"FileDownloadServlet\" method=\"post\">");
out.println(" <input type=\"hidden\" name=\"fileName\" value=\"" + fileName + "\" />");
out.println(" <input type=\"hidden\" size=\"200\" name=\"filePath\" value=\"" + serverPath + "\" />");
out.println(" <input type=\"submit\" name=\"submit\" value=\"下载上传的文件\" />");
out.println("</form>");
} catch (Exception e) {
e.printStackTrace();
}
fileInfo = new HashMap();
fileInfo.put("size", String.valueOf(size));
fileInfo.put("userpath", userPath);
fileInfo.put("name",fileName);
fileInfo.put("ext", fileExt);
fileInfo.put("serverpath", serverPath);
fileInfoList.add(fileInfo);
} else {
String fieldName = fileItem.getFieldName();
/**
* 在取字段值的时候,用FileItem.getString(”UTF-8″),这项设置可以解决获取的表单字段为乱码的问题。
*/
String value = fileItem.getString("UTF-8");
parameters.put(fieldName, value);
}
}
}
/**
* 该方法支持支持国际化
* 但是文件名不能超过17个汉字
* 而且在IE6下存在bug
*/
public void downloadI18N(HttpServletRequest request, HttpServletResponse response) throws Exception {
response.setContentType("text/html;charset=utf-8");
java.io.BufferedInputStream bis = null;
java.io.BufferedOutputStream bos = null;
String filePath = request.getParameter("filePath");
String fileName = request.getParameter("fileName");
System.out.println(fileName);
try {
long fileLength = new File(filePath).length();
fileName = URLEncoder.encode(fileName, "UTF-8");
response.setContentType("application/x-msdownload;");
response.setHeader("Content-disposition", "attachment; filename=" + fileName);
response.setHeader("Content-Length", String.valueOf(fileLength));
bis = new BufferedInputStream(new FileInputStream(filePath));
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[2048];
int bytesRead;
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bis != null)
bis.close();
if (bos != null)
bos.close();
}
}
/**
* 支持中文,文件名长度无限制
* 不支持国际化
*/
public void download(HttpServletRequest request, HttpServletResponse response) throws Exception {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("UTF-8");
java.io.BufferedInputStream bis = null;
java.io.BufferedOutputStream bos = null;
String filePath = request.getParameter("filePath");
String fileName = request.getParameter("fileName");
System.out.println(fileName);
try {
long fileLength = new File(filePath).length();
response.setContentType("application/x-msdownload;");
response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("GBK"),"ISO8859-1"));
response.setHeader("Content-Length", String.valueOf(fileLength));
bis = new BufferedInputStream(new FileInputStream(filePath));
bos = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[2048];
int bytesRead;
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bis != null)
bis.close();
if (bos != null)
bos.close();
}
}
public List getFileInfoList() {
return fileInfoList;
}
public void setFileInfoList(List fileInfoList) {
this.fileInfoList = fileInfoList;
}
public Map getParameters() {
return parameters;
}
public void setParameters(Map parameters) {
this.parameters = parameters;
}
public String[] getAllowedExt() {
return allowedExt;
}
public void setAllowedExt(String[] allowedExt) {
this.allowedExt = allowedExt;
}
public long getMAX_SIZE() {
return MAX_SIZE;
}
public void setMAX_SIZE(long max_size) {
MAX_SIZE = max_size;
}
}
实例化之前可以先对上传的文件设置一些参数,如上传文件的大小以及上传文件的类型等等
上传之后的文件信息可以通过fileInfoList遍历获取,表单域信息可以通过parameter获取
下载有两种方法:
第一种downloadI18N支持国际化,但是只能是17个汉字以内的文件名,IE6下有bug(
IE6的BUG,可以打补丁解决,http://support.microsoft.com/default.aspx?kbid=816868)
第二种download不支持国际化,但是长度没有限制
附上工程文件:MyProjec.zip
分享到:
相关推荐
这个"最全的common-FileUpload.jar包"结合了两个关键的Apache Commons库,为开发者提供了强大的文件上传解决方案,无论是小型项目还是大型企业级应用,都能从中受益。通过深入理解和有效利用这些工具,可以极大地...
首先,我们来看一下标题:“利用Common-fileupload封装的文件上传组件...附上源码”。这表明我们将讨论如何使用这个库来创建一个文件上传系统,并且提供有源码可供参考。通过`Common-fileupload`,我们可以实现用户...
Apache Commons FileUpload是一个Java库,专门用于处理HTTP协议中的多部分文件上传请求。在Web应用程序中,它允许用户上传文件到服务器,这对于处理用户提交的图片、文档或其他类型的数据至关重要。 描述中提及的...
本篇文章将详细讲解如何使用`Commons-FileUpload`进行文件上传,并读取上传文件的内容。 首先,了解`Commons-FileUpload`的工作原理。它解析HTTP请求,将多部分的数据分割成单独的部分,这些部分可以是文本或文件。...
在Java开发中,`common...总之,`common-io`和`common-fileupload`是Java开发中的强大工具,它们简化了常见的I/O操作和文件上传处理,提高了开发效率。了解并熟练运用这些库,能帮助开发者更好地应对实际项目中的挑战。
在"Common-FileUpload实现文件上传.doc"文档中,可能会详细介绍如何利用这个库来处理用户的文件上传请求。Common-FileUpload提供了一套完整的API,用于解析请求中的多部分数据,从而提取上传的文件。使用它,开发者...
"Common-FileUpload带进度条文件上传"是一个专门处理这种需求的解决方案,它允许用户在上传文件时看到进度条,提供更好的用户体验。下面我们将详细探讨这个主题以及相关知识点。 1. 文件上传的基本原理:在Web开发...
在Java开发中,上传文件是一项常见的任务,而`commons-fileupload-1.3.3.jar`和`commons-io-2.6.jar`是Apache Commons项目中的两个重要库,专门用于处理HTTP请求中的文件上传功能。这两个库为开发者提供了便捷、高效...
下面,我们将深入探讨如何使用`Commons FileUpload`库在Java中实现文件上传功能,并基于提供的"文件上传demo"进行分析。 首先,我们需要添加`Commons FileUpload`的依赖到我们的项目中。如果你使用的是Maven,可以...
2. **添加依赖**:下载`commons-fileupload`的JAR包,例如`commons-fileupload-1.0-beta-1.jar`,并将它放入Tomcat的`lib`目录下,通常是`${TOMCAT}/common/lib`。此外,由于`commons-fileupload`依赖于`commons-...
在文件上传和下载场景中,Servlet接收客户端请求,处理文件操作,并将结果返回给客户端。 三、文件上传步骤 1. **配置Servlet**:首先,需要在web.xml中注册一个Servlet,指定它处理的请求URL。 2. **创建Servlet**...
### Common-fileupload组件实现文件上传 #### 一、概述 在现代Web开发中,文件上传是一项常见的需求。尤其是在Java Web应用程序中,实现文件上传功能变得越来越简单,这得益于丰富的开源库支持。Common-fileupload...
`params`拦截器负责解析普通表单字段,而`fileUpload`拦截器则处理文件上传,将文件内容封装到Action类的属性中。 6. **文件保存**: - 一旦文件被解析并映射到Action类,你可以选择保存到服务器的某个位置。这...
commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar jar 文件。 commons-fileupload-1.2.1.jar和commons-io-1.3.2.jar 案例上传: http://hi.baidu.com/lichao77821/blog commons-fileupload-1.2.1.jar和commons-...
在Java Web开发中,文件的上传和下载是常见的...以上就是关于`commons-fileupload`组件在Java Servlet环境下的文件上传与下载的实现原理和关键知识点。通过合理的使用和配置,我们可以实现安全、高效的文件操作功能。
Apache Commons FileUpload与Apache Commons IO是Java开发中处理文件上传的两个重要库,它们在Web应用中被广泛使用。这两个库分别提供了不同的功能,但在处理文件上传时常常一起使用。 `commons-fileupload-1.2.1....
"common-fileupload"和"common-io"是Apache Commons项目中的两个重要组件,它们为处理文件上传和输入/输出提供了强大的支持。接下来,我们将详细讨论这两个库的功能、使用方法及其在JSP应用中的重要性。 Apache ...
标题 "common-FileUpload.jar" 指向的是一个用于处理文件上传功能的Java库,具体来说是Apache Commons FileUpload组件的实现。这个组件广泛应用于Web应用开发中,特别是那些需要用户上传文件的场景,如图片上传、...
总之,`commons-fileupload-1.2.2.jar`和`commons-io-2.4.jar`是Java Web开发中处理文件上传和下载不可或缺的工具。尽管它们的版本可能不是最新的,但依然能提供可靠的功能,并且在很多现有的系统中广泛使用。理解并...