Apache FileUpload 四种方式实现文件上传
使用commons-fileupload处理HTTP文件上传

使用commons-fileupload处理HTTP文件上传
刘冬
【期刊名称】《开放系统世界》
【年(卷),期】2003(000)006
【摘要】Commom是Apache开放源代码组织中的一个Java子项目,该项目主要涉及一些开发中常用的模块。
例如文件上传、命令行处理、数据库连接池、XML配置文件处理等。
这些项目集合了来自世界各地软件工程师的心血,其性能、稳定性等方面都经受得住实际应用的考验。
有效地利用这些项目将会给开发带来显而易见的效果。
Fileupload就是其中用来处理HTTP文件上传的子项目。
本文主
要介绍如何使用Fileupload来处理浏览器提交到服务器的文件信息。
【总页数】3页(P99-101)
【作者】刘冬
【作者单位】无
【正文语种】中文
【中图分类】TP391.1
【相关文献】
1.基于HTTP文件上传进度显示组件的设计及实现 [J], 段旭光;李岚;董立岩;臧雪
柏
2.SolarWinds Orion NPM中使用HTTPS [J], 何今成;杜致远
3.基于HTTP协议和数据库的文件上传方法 [J], 黄景文
4.让Gmail始终使用https连接 [J], 王勇
5.如何设置证书来使用IIS 7 HTTPS? [J],
因版权原因,仅展示原文概要,查看原文内容请购买。
fileupload

}
编译该servlet,注意要指定classpath,确保包含commons-upload-1.0.jar和tomcat\common\lib\servlet-api.jar。
配置servlet,用记事本打开tomcat\webapps\你的webapp\web-inf\web.xml,没有的话新建一个。典型配置如下:
<web-app>
<servlet>
<servlet-name>upload</servlet-name>
<servlet-class>upload</servlet-class>
</servlet>
<servlet-mapping>
// 得到所有的文件:
list fileitems = fu.parserequest(request);
iterator i = fileitems.iterator();
// 依次处理每一个文件:
while(i.hasnext()) {
import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;
注意action="fileupload"其中fileupload是配置servlet时指定的url-pattern。
关于Commons-fileupload的上传组件

关于Commons-fileupload的上传组件Apache的上传组件其它已经被封装到Struts那中去了,我在网上找到了一些文章介绍它是如何上传文件的,自己跟了一下源码也写了一个上传的实例,仅供参考!一、JSP页面如下:Html代码1<form method="POST" action="UploadServlet"2 ENCTYPE="multipart/form-data">3<table>4<tr><td><input type="text" name="subject" /></td></tr> 5<tr><td><input type="text" name="subject" /></td></tr> 6<tr><td><input type="file" name="file1" /></td></tr>7<tr><td><input type="file" name="file2" /></td></tr>8<tr><td><input type="file" name="file3" /></td></tr>9<tr><td><input type="submit" value="上传"/></td></tr> 10</table>11</form>12<br/>13<a href="DownLoadServlet">下载</a>二、上传的Servlet如下:Java代码14/**15 * Apache组件上传16 *17 * @author mingxue.zhang@18 * @date 2010-10-3019 */20public class UploadServlet extends HttpServlet {2122private static final long serialVersionUID = 5827821285414610443L;2324public void doGet(HttpServletRequest request, HttpServletResponse response)25throws ServletException, IOException {26this.doPost(request, response);27 }2829public void doPost(HttpServletRequest request, HttpServletResponse response)30throws ServletException, IOException {31 // 上传文件目录32 String uploadDir =this.getServletContext().getRealPath("/uploadDir");33 DiskFileItemFactory factory = new DiskFileItemFactory();34 // 设置内存区块大小4KB35 factory.setSizeThreshold(4 * 1024);36 // 设置暂存容器,当上传文件大于设置的内存块大小时,用暂存容器做中转37 factory.setRepository(newFile(this.getServletContext().getRealPath(38 "/temp")));39 ServletFileUpload fileUpload = new ServletFileUpload(factory);40 fileUpload.setSizeMax(1024 * 1024 * 100);41 fileUpload.setFileSizeMax(1024 * 1024 * 10);42 List<FileItem> fileItemList = null;4344try {45 fileItemList = fileUpload.parseRequest(request);46 } catch (FileUploadException e) {47 e.printStackTrace();48 }49 Iterator<FileItem> fileItemIterator = fileItemList.iterator();50 FileItem fileItem = null;51while (fileItemIterator.hasNext()) {52 fileItem = fileItemIterator.next();53 // 普通文件框上传54if (fileItem.isFormField()) {55 String filedName = fileItem.getFieldName();56 String filedValue = fileItem.getString("GBK");// 编码格式57 System.out.println(filedName);// 文件框名称58 System.out.println(filedValue);// 文件的值59 } else {60 String filedName = fileItem.getFieldName();// 文件上传框的名称61 // 获取文件上传的文件名62 String OriginalFileName =takeOutFileName(fileItem.getName());63 System.out.println("原始文件名:"+OriginalFileName);64if (!"".equals(OriginalFileName)) {65 // 根据上传的文件名重新命名66 String newFileName =getNewFileName(OriginalFileName);67 System.out.println("重新名:"+newFileName);68 File writeToFile = new File(uploadDir + File.separator69 + newFileName);70try {71 fileItem.write(writeToFile);72 } catch (Exception e) {73 e.printStackTrace();74 }75 }76 }77 }78 }7980private String takeOutFileName(String filePath) {81 String fileName = filePath;82if (null != filePath && !"".equals(filePath)) {83int port = stIndexOf("\\" + 1);84if(port != -1){85 fileName = filePath.substring(port);86 }87 }88return fileName;89 }9091private String getNewFileName(String originalFileName) {92 StringBuffer newFileName = new StringBuffer();93if (null != originalFileName && !"".equals(originalFileName)) { 94int port = stIndexOf(".");95 String type = "";96 String fileName = "";97if (port != -1) {98 type = originalFileName.substring(port + 1);99 fileName = originalFileName.substring(0, port);100 } else {101 fileName = originalFileName;102 }103 StringBuffer suffix = new StringBuffer("_");104 suffix.append(Calendar.getInstance().getTimeInMillis()); 105 suffix.append("_");106 suffix.append(new Random().nextInt(100));107 newFileName.append(fileName);108 newFileName.append(suffix);109 newFileName.append(".");110 newFileName.append(type);111 }112return newFileName.toString();113 }114115}三、下载的Servlet如下:Java代码116/**117 * Apache组件下载118 *119 * @author mingxue.zhang@120 * @date 2010-10-30121 */122public class DownLoadServlet extends HttpServlet {123124public void doGet(HttpServletRequest request, HttpServletResponseresponse)125throws ServletException, IOException {126this.doPost(request, response);127 }128129public void doPost(HttpServletRequest request, HttpServletResponse response)130throws ServletException, IOException {131 String filePath ="D:\\Tomcat\\apache-tomcat-6.0.26\\webapps\\ApacheUpload\\uploadDir\\";132 String fileName = "2010年10月安排2_1288447490125_56.txt";133 String Originalname = "2010年10月安排2.txt";134 response.setContentType("application/octet-stream");135 String isoFileName = new String(Originalname.getBytes("GB2312"), 136 "ISO8859-1");137 response.setHeader("Content-Disposition", "attachment; filename="138 + isoFileName);139 ServletOutputStream out = response.getOutputStream();140 BufferedOutputStream bufferOut = new BufferedOutputStream(out);141 FileInputStream inputStream = new FileInputStream(newFile(filePath,142 fileName));143 BufferedInputStream bufferInput = newBufferedInputStream(inputStream);144byte[] buffer = new byte[5 * 1024];145int length = 0;146while ((length = bufferInput.read(buffer)) != -1) {147 bufferOut.write(buffer, 0, length);148 }149 bufferInput.close();150 inputStream.close();151 bufferOut.close();152 out.close();153 }154155}Servlet配置如下:Xml代码156<servlet>157<servlet-name>UploadServlet</servlet-name>158<servlet-class>com.mengya.servlet.UploadServlet</servlet-class> 159</servlet>160<servlet>161<servlet-name>DownLoadServlet</servlet-name>162<servlet-class>com.mengya.servlet.DownLoadServlet</servlet-class>163</servlet>164165<servlet-mapping>166<servlet-name>UploadServlet</servlet-name>167<url-pattern>/UploadServlet</url-pattern>168</servlet-mapping>169<servlet-mapping>170<servlet-name>DownLoadServlet</servlet-name>171<url-pattern>/DownLoadServlet</url-pattern>172</servlet-mapping>。
文件上传之Apachecommonsfileupload使用

⽂件上传之Apachecommonsfileupload使⽤ ⽂件上传的⽅法主要⽬前有两个常⽤的,⼀个是SmartUpload,⼀个是Apache的Commons fileupload. 我们这⾥主要介绍下第⼆个的⽤法,⾸先要上传⽂件,注意⼏个问题: 1 form表单内,要添加空间<input type="file" name="myfile"> 2 form表单的内容格式要定义成multipart/form-data格式 3 需要类库:1 commons-io.jar 2commons-fileupload-1.3.1.jar 接下来我们看下他的⽤法。
⾸先阅读Apache commons fileupload的官⽅⽂档可以发现下⾯⼏个常⽤的函数: 1 创建⽂件解析对象DiskFileUpload diskFileUpload = new DiskFileUpload(); 2 进⾏⽂件解析后放在List中,因为这个类库⽀持多个⽂件上传,因此把结果会存在List中。
List<FileItem> list = diskFileUpload.parseRequest(request); 3 获取上传⽂件,进⾏分析(不是必须)File remoteFile = new File(new String(fileItem.getName().getBytes(),"UTF-8")); 4 创建新对象,进⾏流拷贝file1 = new File(this.getServletContext().getRealPath("attachment"),remoteFile.getName());file1.getParentFile().mkdirs();file1.createNewFile();InputStream ins = fileItem.getInputStream();OutputStream ous = new FileOutputStream(file1);try{byte[] buffer = new byte[1024];int len = 0;while((len = ins.read(buffer)) > -1)ous.write(buffer,0,len);out.println("以保存⽂件"+file1.getAbsolutePath()+"<br/>");}finally{ous.close();ins.close();} 这样我们就完成了⽂件的上传。
fileupload使用

fileupload使用
fileupload是一种用于上传文件的工具,可以方便地将本地文件上传到服务器。
以下是使用fileupload的步骤:
1. 引入fileupload的js和css文件。
2. 创建一个form表单,设置enctype属性为
'multipart/form-data',并包含一个input标签用于选择文件。
3. 在js代码中,使用$(selector).fileupload()函数初始化fileupload插件。
可以设置一些选项,如url、formData、dataType 等,用于控制上传的行为。
4. 在服务器端,通过解析上传的请求,将上传的文件保存到服务器。
需要注意的是,为了防止文件大小过大导致上传失败,可以在客户端和服务器端都对上传的文件进行大小限制和类型校验。
fileupload的使用相对简单,但在实际项目中可能会有更多的需求和复杂的场景。
因此,建议在使用前先了解一下具体的插件文档和示例。
- 1 -。
使用组件FileUpload

FileUpload 是Apache commons下面的一个子项目,用来实现Java环境下面的文件上传功能,与常见的SmartUpload齐名。
[编辑本段]一、使用组件FileUpload可以通过许多种不同的方式使用组件FileUpload,这个主要取决于你的应用程序。
在最简单的情况下,你可以调用单一的方法去解析这个Servlet Request,然后处理选项列表,并应用到你的应用程序。
另一方面,你可能决定自定义FileUpload,实现对选项列表种个别项完全控制。
例如:你可以将内容注入到数据库。
这里,我们将描述组件FileUpload的基本原则,并讲解一些简单的、常用的使用模式。
FileUpload自定制将在其他地方描述。
组件FileUpload依赖于Commons IO组件,因此在继续之前,要确保在你的工程classpath中有描述页中提到的相应版本。
(这里FileUpload版本为:commons- fileupload-1.2.1,Commons IO版本为:commons-io-1.4)[编辑本段]二、组件FileUpload是怎样工作的上传的文件要求包括一个根据RFC 1867(在HTML中基于表单的文件)编码的选项列表清单。
组件FileUpload可以解析这个请求,并给你的应用程序提供一份独立上传的项目清单。
无论每个项目背后如何执行都实现了FileItem接口。
这里将描述组件FileUpload库的普通API,这些API比较简单。
不过,对于最终的实现,你可以参考最新的API流。
每一个文件项目都有一些属性,这些可能在你的应用程序中应用到。
比如:每一个项目有一个名称name和内容类型congtent type,并提供了一个InputStream访问其数据。
另一方面,你处理项目的方法可能有所不同,这个依赖于是否这个项目是一个规则的表单域,即:这个数据是来自普通的表单文本,还是普通的HTML域或是一个上传文件。
apache2.4 上传模板

apache2.4 上传模板
1.上传文件名乱码问题:
upload.setHeaderEncoding("UTF-8");
1.1普通输入项中文乱码(两种方法)
String value = fileitem.getString("UTF-8");
value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
2.为保证服务器安全,上传文件应放到外界无法访问的目录
3.为防止文件覆盖的发生,要为每一个文件产生一个唯一的文件名
4.防止上传文件保存目录超过一千个文件,用hash算法打散
5.限制上传文件的大小可以用
upload.setFileSizeMax(1024);//单个文件限制大小
upload.setSizeMax(1024*16);//多个文件一起限制大小
超过大小用抛出FileUploadBase.FileSizeLimitExceededException异常提示用户
6.确保临时文件被删除,一定要在处理完上传文件后,调用fileitem.delete()方法
7.限制文件的上传类型可以通过判断文件的后缀名实现。
JavaWeb:文件上传(详)

2、前端表单form表单提交⽅式:method=“post”(post传送的数据量⼤,可视为不受限制)text/plain:将空格转换为+号,其它字符不做编码处理,适⽤于通过表单发送邮件。
input输⼊框类型:type=“file”4、实现步骤带 * 号的是⽤于完善业务的辅助功能,不是必要的。
1. 判断表单:是否包含⽂件上传控件。
2、前端页⾯fileUpload.jsp<form action="${pageContext.request.contextPath}/upload.do" method="post" enctype="multipart/form-data"></form>success.jsp<h1>${msg}</h1>// 判断表单项是否为上传⽂件if (fileItem.isFormField()) { // 普通⽂本String filedName = fileItem.getFieldName(); // 获取字段名:表单项name属性的值String value = fileItem.getString("UTF-8"); // FileItem对象中保存的数据流内容:即表单项为普通⽂本的输⼊值 System.out.println(filedName + ":" + value);} else { // 上传⽂件// ------------------------1、处理⽂件------------------------String uploadFileName = fileItem.getName();// 上传⽂件名System.out.println("上传的⽂件名:" + uploadFileName);if (uploadFileName == null || uploadFileName.trim().equals("")) { // ⽂件名为空值或空continue; // 进⼊下⼀轮循环,判断下⼀个FileItem对象}String fileExtName = uploadFileName.substring(stIndexOf(".") + 1); // ⽂件后缀名System.out.println("⽂件信息【⽂件名:" + uploadFileName + ",⽂件类型:" + fileExtName + "】");// 使⽤UUID保证⽂件名唯⼀String uuidPath = UUID.randomUUID().toString();// ------------------------2、处理路径------------------------// 存储路径:uploadPathString realPath = uploadPath + '/' + uuidPath; // 真实存在的路径// 给每个⽂件创建⼀个⽂件夹File realPathFile = new File(realPath);makeDirIfNotExist(realPathFile);// ------------------------3、⽂件传输------------------------// 获得输⼊流InputStream is = fileItem.getInputStream();// 获得输出流FileOutputStream fos = new FileOutputStream(realPathFile + "/" + uploadFileName);// 创建缓冲区byte[] buffer = new byte[1024];int len;while ((len = is.read(buffer)) > 0) {fos.write(buffer, 0, len);}msg = "⽂件上传成功!";fileItem.delete(); // 上传成功,清除临时⽂件fos.close();is.close();}}return msg;}private ServletFileUpload getServletFileUpload(DiskFileItemFactory factory) {// ServletFileUpload servletFileUpload = new ServletFileUpload(factory); // 构造⽅法设置FileItemFactoryServletFileUpload servletFileUpload = new ServletFileUpload();servletFileUpload.setFileItemFactory(factory); // 设置FileItemFactory// ------------------------辅助功能------------------------// 监听⽂件上传进度servletFileUpload.setProgressListener(new ProgressListener() {/**** @param pBytesRead 已读取的⽂件⼤⼩* @param pContentLength ⽂件⼤⼩5、运⾏结果上传的⽂件会保存在Target⽬录下对应项⽬的保存路径下。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
将Apache的commons-fileupload.jar放在应用程序的WEB-INF\lib下,即可使用。
下面举例介绍如何使用它的文件上传功能。
所使用的fileUpload版本为1.2,环境为Eclipse3.3+MyEclipse6.0。
FileUpload 是基于Commons IO的,所以在进入项目前先确定Commons IO的jar包(本文使用commons-io-1.3.2.jar)在WEB-INF\lib下。
此文作示例工程可在文章最后的附件中下载。
示例1最简单的例子,通过ServletFileUpload静态类来解析Request,工厂类FileItemFactory会对mulipart类的表单中的所有字段进行处理,不只是file字段。
getName()得到文件名,getString ()得到表单数据内容,isFormField()可判断是否为普通的表单项。
demo1.html<html><head><meta http-equiv="Content-Type" content="text/html; charset=GB18030"><title>File upload</title></head><body>//必须是multipart的表单数据。
<form name="myform" action="demo1.jsp" method="post"enctype="multipart/form-data">Your name: <br><input type="text" name="name" size="15"><br>File:<br><input type="file" name="myfile"><br><br><input type="submit" name="submit" value="Commit"></form></body></html>demo1.jsp<%@ page language="java" contentType="text/html; charset=GB18030"pageEncoding="GB18030"%><%@ page import="mons.fileupload.*"%><%@ page import="mons.fileupload.servlet.*"%><%@ page import="mons.fileupload.disk.*"%><%@ page import="java.util.*"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><%boolean isMultipart = ServletFileUpload.isMultipartContent(request);//检查输入请求是否为multipart表单数据。
if (isMultipart == true) {FileItemFactory factory = new DiskFileItemFactory();//为该请求创建一个DiskFileItemFactory对象,通过它来解析请求。
执行解析后,所有的表单项目都保存在一个List中。
ServletFileUpload upload = new ServletFileUpload(factory);List<FileItem> items = upload.parseRequest(request);Iterator<FileItem> itr = items.iterator();while (itr.hasNext()) {FileItem item = (FileItem) itr.next();//检查当前项目是普通表单项目还是上传文件。
if (item.isFormField()) {//如果是普通表单项目,显示表单内容。
String fieldName = item.getFieldName();if (fieldName.equals("name")) //对应demo1.html中type="text" name="name"out.print("the field name is" + item.getString());//显示表单内容。
out.print("<br>");} else {//如果是上传文件,显示文件名。
out.print("the upload file name is" + item.getName());out.print("<br>");}}} else {out.print("the enctype must be multipart/form-data");}%><html><head><meta http-equiv="Content-Type" content="text/html; charset=GB18030"><title>File upload</title></head><body></body></html>结果:the field name isjeffthe upload file name isD:\C语言考试样题\作业题.rar示例2上传两个文件到指定的目录。
demo2.html<html><head><meta http-equiv="Content-Type" content="text/html; charset=GB18030"><title>File upload</title></head><body><form name="myform" action="demo2.jsp" method="post"enctype="multipart/form-data">File1:<br><input type="file" name="myfile"><br>File2:<br><input type="file" name="myfile"><br><br><input type="submit" name="submit" value="Commit"></form></body></html>demo2.jsp<%@ page language="java" contentType="text/html; charset=GB18030"pageEncoding="GB18030"%><%@ page import="mons.fileupload.*"%><%@ page import="mons.fileupload.servlet.*"%><%@ page import="mons.fileupload.disk.*"%><%@ page import="java.util.*"%><%@ page import="java.io.*"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><%String uploadPath="D:\\temp";boolean isMultipart = ServletFileUpload.isMultipartContent(request);if(isMultipart==true){try{FileItemFactory factory = new DiskFileItemFactory();ServletFileUpload upload = new ServletFileUpload(factory);List<FileItem> items = upload.parseRequest(request);//得到所有的文件Iterator<FileItem> itr = items.iterator();while(itr.hasNext()){//依次处理每个文件FileItem item=(FileItem)itr.next();String fileName=item.getName();//获得文件名,包括路径if(fileName!=null){File fullFile=new File(item.getName());File savedFile=new File(uploadPath,fullFile.getName());item.write(savedFile);}}out.print("upload succeed");}catch(Exception e){e.printStackTrace();}}else{out.println("the enctype must be multipart/form-data");}%><html><head><meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title></head><body></body></html>结果:upload succeed此时,在"D:\temp"下可以看到你上传的两个文件。