commons-fileupload-1.0上传组件使用实例
Java使用Commons-FileUpload组件实现文件上传最佳方案
Java使⽤Commons-FileUpload组件实现⽂件上传最佳⽅案学习的⽬标使⽤commons-fileupload实现⽂件上传使⽤commons-fileupload封装⽂件上传⼯具类什么是commons-fileupload?The CommonsFileUploadpackage makes it easy to add robust, high-performance, file upload capability to your servlets and web applications.FileUpload parses HTTP requests which conform toRFC 1867, "Form-based File Upload in HTML". That is, if an HTTP request is submitted using the POST method, and with a content type of "multipart/form-data", then FileUpload can parse that request, and make the results available in a manner easily used by the caller.FileUpload包可以很容易地添加强⼤的,⾼性能,⽂件上传到你的Servlet的Web应⽤程序的能⼒。
FileUpload解析HTTP请求符合RFC 1867年,“在HTML的⽂件上传。
就是说,如果⼀个HTTP请求是使⽤POST⽅法提交,并与⼀个内容类型“multipart/form-data”,然后FileUpload可以解析这个请求,并把结果提供⼀个容易使⽤的调⽤⽅式。
为什么要使⽤commons-fileupload在使⽤传统的Servlet上传的时候我们可以使⽤req.getInputStream()来获取⽂件上传的流,我们在获取到这个流之后需要⼿动的针对这个流进⾏特殊处理进⾏去流中不必要的开始和结束内容,才能真正的获取到流的内容,本章节并不对原始Servlet的上传进⾏探究,我们另开章节针对原始Servelt上传进⾏探究。
关于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>。
jsp图片上传(commons-fileupload组件)
1.开发环境:1)eclipse3.2+tomcat5.5;2)创建dynamic web project;3)下载:Commons FileUpload 可以在/commons/fileupload/下载附加的Commons IO 可以在/commons/io/下载将commons-fileupload-1.2.1.jar commons-io-1.4.jar拷贝到WebContent\WEB-INF\\lib 目录;2.前台:<;form method=";post"; enctype=";multipart/form-data"; action=";upload.jsp"; target=";_blank";>;<;%-- 类型enctype用multipart/form-data,这样可以把文件中的数据作为流式数据上传,不管是什么文件类型,均可上传--%>;<;table>;<;tr>;<;td>;作品:<;input type=";file"; name=";upfile"; size=";50";>;<;/td>;<;/tr>;<;tr>;<;td>;作者:<;input type=";text"; name=";author"; size=";22";>;标题:<;input type=";text"; name=";title"; size=";22";>;<;input type=";submit"; name=";submit"; value=";上传";>;<;/td>;<;/tr>;<;tr>;<;td>;备注:上传的jpg图片(显示扩展名为.jpg)大小不能超过4M!<;/td>;<;/tr>; <;/table>;<;/form>;3.后台:1)引用:<;%@ page import=";mons.fileupload.servlet.ServletFileUpload";%>; <;%@ page import=";mons.fileupload.disk.DiskFileItemFactory";%>; <;%@ page import=";mons.fileupload.*";%>;2)代码:String id=null;//上传记录idString destinationfileName=null;//目标文件名String author=null;String title=null;int flag=0;//上传标志String uploadPath =request.getSession().getServletContext().getRealPath(";/";)+";upload/";;//图片上传路径String tempPath = request.getSession().getServletContext().getRealPath(";/";)+";upload/temp/";;//图片临时上传路径StringimagePath=request.getScheme()+";://";+request.getServerName()+";:";+request.getS erverPort()+request.getContextPath()+";/";; // 图片网络相对路径if(!new File(uploadPath).isDirectory()) new File(uploadPath).mkdirs();// 文件夹不存在就自动创建:if(!new File(tempPath).isDirectory())new File(tempPath).mkdirs();try {DiskFileUpload fu = new DiskFileUpload();fu.setSizeMax(4194304);// 设置最大文件尺寸,这里是4MBfu.setSizeThreshold(4096);// 设置缓冲区大小,这里是4kbfu.setRepositoryPath(tempPath);// 设置临时目录:List fileItems = fu.parseRequest(request);// 得到所有的文件:Iterator i = fileItems.iterator();while(i.hasNext()) {// 依次处理表单中每个域FileItem file = (FileItem)i.next();// 获得用户上传时文件名if (file.isFormField()){ //获得文本域表单数据if(";author";.equals(file.getFieldName()))author=codeToString(file.getString());if(";title";.equals(file.getFieldName())) title=codeToString(file.getString()); continue;//非file域不处理}String sourcefileName = file.getName();if( sourcefileName.endsWith(";.jpg";)){//生成上传后的文件名Random rd = new Random();Calendar time = Calendar.getInstance();id=String.valueOf(time.get(Calendar.YEAR))+ String.valueOf(time.get(Calendar.MONTH)+1)+ String.valueOf(time.get(Calendar.DAY_OF_MONTH))+ String.valueOf(time.get(Calendar.HOUR_OF_DAY))+ String.valueOf(time.get(Calendar.MINUTE))+ String.valueOf(time.get(Calendar.SECOND))+ String.valueOf(rd.nextInt(100));destinationfileName=id+";.jpg";;File fTmp=new File(uploadPath+destinationfileName);file.write(fTmp);//out.print(";<;img src=";+imagePath+";upload/";+destinationfileName+";>;";); flag=1;//上传成功标志1}else{out.print(";上传失败,只能上传jpg文件!";); }}//out.print(";<;script>;location.href=\";demo.jsp\";;<;/script>;";);}catch (IOException e) {out.print(";上传失败!";);}out.flush();out.close();4.主要解决点:1)问题:form设置enctype=";multipart/form-data";,request.getParameters函数无法获取表单域值;2)解决方案:if (file.isFormField()){ //获得文本域表单数据if(";author";.equals(file.getFieldName()))author=codeToString(file.getString());if(";title";.equals(file.getFieldName())) title=codeToString(file.getString()); continue;//非file域不处理}。
Commons FileUpload组件在网上投稿系统中的应用
摘要 : 文件 土 传是 很 多 W E B应 用 q 都 需要 的 功 能 。 基 于表 单 的 文件 上 传 和 C mmo s i Upo d两 个 方 面 , 究 了 文件 上 传 的原 - 从 o n l la Fe 研 理 和 实现 机 制 . 网上 投 稿 系统 实 际应 用 中 , 出了使 用 Co lln F e po d组 件 的 Sra n P 将 文 件 保 存 到 My Q 在 给 niO S i U la i l t migA I e S L数 据 库
络 开 发 文 件 上 传 的 首 选 组 件 之 一 。 另 一个 比 较 有 名 的 文 件上 传组 件 足 S a U l d { j m r po ,很 多 J P书 籍 中介 绍 的文 件 上 传 都 是 使 用 t a S
S r pod组 件 ( 官方 网站 已经 无 法 打 开 了 ) 很 多 用 户 反 映 S at po d在 某 些 情 况 下并 小 能 很 好 的 工 作 。 ma U la t 其 , mr ] U a C m o s i U la o m n l pod可 以 从 ht:emm n . a h _ 0 no d /o n0 ( i c i 载 。 网 上 投 稿 系 统 以 T m a 做 J v b应 Fe t / o o s p ce ) d w l s w l 1 o g 下 p/ a 1 r a d d -一 . o ct a aWe 用容器 , 解 下 载 的义 件 , l 1 件 夹 里 cmm n — l pod x -_ 义 件 复 制 到 T mct 把 i文 } o o s fe l — . x i u a X o a 的安 装 目录 下 的 cmm nl 目录下 。 o o/b i 解压
commons-fileupload用户指南
使用fileupload根据你的应用需求,fileupload可以有许多不同的使用方式。
在最简单的情况下,你可以调用一个简单的方法来解析servlet请求,然后在他们提交到你的应用时处理表单列表。
在其它规模的终端上,你也可能决定将fileupload进行自定义,以完全控制个别表单项存储的方法。
比如,你或许会将内容流化来保存到数据中。
在这里。
我们将要描述fileupload的基本使用方法,然后解释一些更简单的,以及最常用的使用模式。
fileupload的个性化在这里得到了描述。
它怎么工作一个文件上传请求由有序表单项的列表组成,这些表单是根据RFC1867来编码的,是在html中基于表单的文件上传。
fileupload能解析这样一个请求然后向你的应用提供一个单独的上传表单项的列表。
每一个这样的表单项实现了FileItem接口,而不需要考虑它潜在的实现方式。
每个文件的表单项拥有一系列可能对你的应用有用的属性,比如,每个项目都有一个名字和文件类型,你就可以提供一个InputStream来取它的数据。
从另一方面说,你可能需要对这些选项进行不同的处理,这个可以根据对这个选项是不是一个规则的表单项来判断,即可以根据这个数据是否来源于普通的文本框或者一个简单的html表单域,还是一个能被上传的文件。
FileItem接口提供了多种方法来判断它是否是一个可上传的文件,然后你就可以用最合适的方式来处理这些数据了。
FileUpload使用FileItemFactory来创建新的文件项目。
这正是给FileUpload带来灵活性的原因。
这个工厂最终控制每个项目的创建。
默认的工厂在内存或者磁盘上保存了项目的数据,这个可以根据项目的大小来定(例如,字节数据)。
当然,这个动作可以通过自定义来满足你应用的需要。
解析请求在你对要上传的选项处理之前,很显然的你得先解析这些请求本身。
很直接的就是要确保这个请求是不是一个要上传的文件,然而FileUpload 使这一点简单化了,你只需提供一个静态的方法来做到这一点。
common fileupload详解
Commons-fileupload工具的API与开发实例解析(一)文件上传组件的应用与编写在许多Web站点应用中都需要为用户提供通过浏览器上传文档资料的功能,例如,上传邮件附件、个人相片、共享资料等。
对文件上传功能,在浏览器端提供了较好的支持,只要将FORM表单的enctype属性设置为“multipart/form-data”即可;但在Web服务器端如何获取浏览器上传的文件,需要进行复杂的编程处理。
为了简化和帮助Web开发人员接收浏览器上传的文件,一些公司和组织专门开发了文件上传组件。
本章将详细介绍如何使用Apache文件上传组件,以及分析该组件源程序的设计思路和实现方法。
1.1 准备实验环境按下面的步骤为本章的例子程序建立运行环境:(1)在Tomcat 5.5.12的<tomcat的安装目录>\webapps目录中创建一个名为fileupload的子目录,并在fileupload目录中创建一个名为test.html的网页文件,在该文件中写上“这是test.html页面的原始内容!”这几个字符。
(2)在<tomcat的安装目录>\webapps\fileupload目录中创建一个名为WEB-INF 的子目录,在WEB-INF目录中创建一个名为classes的子目录和一个web.xml文件,web.xml文件内容如下:<web-app></web-app>(3)要使用Apache文件上传组件,首先需要安装Apache文件上传组件包。
在<tomcat的安装目录>\webapps\fileupload\WEB-INF目录中创建一个名为lib的子目录,然后从网址/commons/fileupload下载到Apache组件的二进制发行包,在本书的附带带光盘中也提供了该组件的二进制发行包,文件名为commons-fileupload-1.0.zip。
文件上传组件_Apache_Commons_FileUpload_应用指南
文件上传组件_A p a c h e_C o m m o n s_F i l e U p l o a d_应用指南-CAL-FENGHAI.-(YICAI)-Company One1Apache Commons FileUpload应用指南前言几乎每一个Web应用中都需要为用户提供文件上传的功能,例如,QQ空间、各种博客的相册、论坛的附件、个人头像等。
对文件上传功能,在浏览器端提供了较好的支持,只要将FORM表单的enctype属性设置为“multipart/form-data”,method属性设置为“post”即可;但在Web服务器端获取通过浏览器上传的文件数据(二进制输入流),需要进行复杂的编程处理。
为了简化文件上传的的处理,一些公司和组织专门开发了文件上传组件。
其中,Apache文件上传组件得到了广泛的传播和应用。
我们将详细介绍如何使用Apache文件上传组件进行文件上传实现。
1 获取上传组件使用Apache Commons Fileupload 文件上传组件需要两个类库文件:1) 1.2.2第一步:下载1.2.2。
在浏览器中输入打开Apache Commons Fileupload 文件上传组件主页面,在Downloading 栏目中点击任意一个版本号后面的“here”超级链接,可以打开当前最新版本的 Apache Commons Fileupload 文件上传组件下载页面,(2010-08-28为止的可下载最新版本是1.2.2版)。
也可以直接输入打开最新版本下载页面。
主页面当前最新版本的下载页面在当前最新版本的下载页面,提供二进制可执行版本(Binares)和源程序版本(Source)两种文件的下载,每一种文件都有两种压缩格式:1).zip,适用windows 操作系统2).,适用 linux 和 unix 操作系统我们这里选择下载 1.2.2 文件。
解压后得到如下目录结构:commons-fileupload-1.2.2 (根目录)-----lib (类库目录)----- 1.2.2 (我们要用的二进制类库)-----site (包括Apache Commons Fileupload 组件站点所有页面文件)----- apidocs (API文档目录,API文档链接可以在下面的首页中找到,也可以直接打开此目录,点击打开API文档)----- (站点首页)第二步:下载。
通过代码示例跟我学Apache Commons-FileUpload文件上传组件技术及应用实例
目录1.2Apache Commons-FileUpload文件上传组件技术及应用实例 (2)1.2.1Apache Commons-FileUpload组件相关技术概述 (2)1.2.2下载Commons-FileUpload组件系统库 (3)1.2.3应用Commons-FileUpload组件实现文件上传功能 (5)1.2.4利用FileUpload组件具体实现文件上传的功能实现代码示例 (7)1.2.5测试本示例的应用效果 (14)1.11.2Apache Commons-FileUpload文件上传组件技术及应用实例1.2.1Apache Commons-FileUpload组件相关技术概述1、Web应用系统中的文件上传在许多Web站点应用中都需要为用户提供通过浏览器上传文档资料的功能,例如,上传邮件附件、个人相片、共享资料等。
文件上传和下载同样也是Web应用系统中的通用功能实现的要求,但如何能够简化对这个功能的实现和避免开发人员重复地编程同样功能的实现程序?在浏览器端提供了较好的支持,只要将FORM表单的enctype属性设置为“multipart/form-data”即可。
但在Web服务器端如何获取浏览器上传的文件,需要进行复杂的编程处理。
为了简化和帮助Web开发人员接收浏览器上传的文件,一些公司和组织专门开发了文件上传组件。
为此,在Commons组件集中也提供有一个Commons-FileUpload组件,帮助Web开发人员实现文件上传的功能。
作者在本节中继续通过银行账户信息管理系统中的文件上传功能的具体实现的示例,为读者介绍如何正确地应用Commons-FileUpload组件,并介绍两种不同的应用方式——标准的Web技术实现和基于Struts2框架下的文件上传功能的实现。
2、Commons-FileUpload文件上传功能组件(1)Commons-FileUpload组件主要实现文件上传功能Commons-FileUpload组件主要实现处理HTTP请求方式下的文件上传功能,并遵守RFC1867标准,它自动地分析上传表单中的各种请求参数,最终向服务器端的程序提供上传后的服务器端文件的数据。
Commons FileUpload组件使用方法
Commons FileUpload组件使用方法2010年03月18日 16:04本文以Commons FileUpload组件为例说明怎样为JSP应用添加文件上传功能.当然也有其它组件能实现此功能,本文只是为了说明Commons FileUpload组件的用法.准备工作:1,下载Commons FileUpload组件包,具体可以在网上找,开源的,免费下载.2,下载Commons IO包,上面的组件必须依赖它才能实现功能.该包也在上面的网页上有提供.注意:如果你是使用Tomcat直接开发应用程序,则把上面下载的两个.ZIP文件解压后,将解压后的commons-io-1.4-sources.jar和commons-fileupload-1.2.1.jar两个.jar文件放到tomcat的webapps\你的webapp\WEB-INF\lib\下,目录不存在的话请自己创建.如果你是直接使用MyEclipse进行开发应用,刚把上面的两个.jar文件放到自己创建的用户库里面,在用到这个库时再导入到应用程序中.步骤:1.创建一个Servlet----Upload.java文件,用于实现上传文件import java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;import mons.fileupload.*;public class Upload extends HttpServlet {private String uploadPath = "d:\\upload\\"; // 上传文件的目录private String tempPath = "d:\\upload\\tmp\\"; // 临时文件目录在doPost()方法中,当servlet收到浏览器发出的Post请求后,实现文件上传。
java web中commons FileUpload文件上传(附代码)
java web中commons FileUpload文件上传一、文件上传1.创建项目,导入jar包将commons-fileupload.jar粘贴到项目下的lib文件夹下。
2.编写上传的jsp页面3.Upload.jsp源代码如下:<%@page language="java"contentType="text/html; charset=utf-8"pageEncoding="utf-8"%><!DOCTYPE html><html><head><meta charset="utf-8"><title>文件上传</title></head><body><form action="/fileUploadDown/Uploadservlet"method="post"enctype="multipart/form-data">请选择文件:<input type="file"name="myfile"/><input type="submit"value="上传"></form></body></html>4.编写处理上传请求的servletimport java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.List;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import mons.fileupload.FileItem;import mons.fileupload.FileItemFactory;import mons.fileupload.FileUploadException; import mons.fileupload.disk.DiskFileItemFactory; import mons.fileupload.servlet.ServletFileUpload; import org.apache.tomcat.util.buf.StringUtils;import org.apache.tomcat.util.http.fileupload.FileUtils;@WebServlet("/Uploadservlet")public class Uploadservlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {this.doPost(request, response);}protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {FileItemFactory factory = new DiskFileItemFactory();request.setCharacterEncoding("utf-8");ServletFileUpload fileupload = new ServletFileUpload(factory);fileupload.setFileSizeMax(1024 * 1024 * 10);// 限制单个文件上传大小为10MBfileupload.setSizeMax(1024 * 1024 * 20);// 限制多文件上传大小为20MBtry {// 解析请求,将表单中的每一个input标签解析成一个FileItemList<FileItem> fileList= fileupload.parseRequest(request);for (FileItem fileItem : fileList) {if (fileItem.isFormField()) {// 是否为普通表单元素String filedName = fileItem.getFieldName();// 获得字段名称String value = fileItem.getString();// 获得字段的值System.out.println(filedName + ":" + value);} else {String fileName = fileItem.getName();// 获得原始路径的文件名fileName =fileName.substring(stIndexOf("\\") + 1);// 获得文件名InputStream is = fileItem.getInputStream();String parentDir =this.getServletContext().getRealPath("/WEB-INF/upload/");String filePath = parentDir + fileName;// 文件保存的路径File file = new File(filePath);if (!file.getParentFile().exists()) { // 父目录不存在file.getParentFile().mkdirs(); // mkdirs():创建文件夹,如果上级目录没有的话,也一并创建出来。
jakarta commons fileupload 说明书
分享文档系列Jakarta Commons FileUpload用户指南作者:日期:2007-3-22版本:V1.0(2007-03-22)较对:hunqiu本文是分享文档站长胡萝卜的作品。
大家可以自由阅读、在网络上进行分发,前提是必须保留本文档的完整性。
分享文档是一家专业的Java技术网站,给中国Java 程序员提供各种Java资源如文档,工具,教程,社区交流等。
我们的官方网站是:我们的官方论坛是:请大家多多关注分享文档,我们还会发布更多优秀的文档!前言什么也不写。
目录第1章使用FILEUPLOAD (4)第2章FILEUPLOAD如何工作? (5)第3章SERVLETS AND PORTLETS (6)第4章解析请求 (7)4.1最简单的例子 (7)4.2训练如何控制 (8)第5章处理上传的项目 (10)第6章清除资源 (13)第7章观察上传进度 (15)第1章使用FileUploadFileUpload能以多种方式使用,这取决于你的应用需求。
举个简单的例子,你可能调用一个单独的方法来解析servelt的请求,并且处理那些项目。
从另一个方面来讲,你可能想自定义FileUpload来完全控制个别项目的存贮;例如,你想流化那些内容,并存到数据库里去。
这里我们会介绍使用FileUpload的基础原则,并描述一些简单的通用的使用模式。
我们会在在其它地方介绍关于FileUpload的自定义。
FileUpload依赖于一些公用的IO,因此,要确保在你继续之前,你的classpath里已经有依赖页面里提起的那些版本。
第2章FileUpload如何工作?一个上传请求由一系列根据RFC1867("Form-based File Upload in HTML".)编码的项目列表组成。
FileUpload可以解析这样的请求,并为你的应用提供那些已上传的项目的列表。
每一个这样的项目都实现了FielItem接口,我们不用管它们的底层实现。
springmvc_文件上传
<propertyname="maxInMemorySize"value="40960"/>
<propertyname="defaultEncoding"value="UTF-8"></property>
@RequestMapping("/upload")
publicStringfileUpload(@RequestParam("file")CommonsMultipartFilefile,HttpServletRequestrequest)throwsException{
//获e =file.getOriginalFilename();
intlen=0;
byte[]buffer=newbyte[400];
while((len=is.read(buffer))!=-1){
os.write(buffer, 0,len);
}
os.close();
is.close();
}catch(Exceptione) {
e.printStackTrace();
SpringMVC实现文件上传
1.通过commons-fileupload来实现
1)导入jar包,commons-fileupload-1.2.1.jar,
commons-io-2.0.1.jar
2)配置springmvc的配置解析器
<beanid="multipartResolver"class="monsMultipartResolver">
文件上传-CommonsFileUpload介绍
⽂件上传-CommonsFileUpload介绍⼀、概述FileUpload能够以多种不同的⽅式使⽤,具体取决于应⽤程序的要求。
在最简单的情况下,调⽤单个⽅法来解析servlet请求,然后处理解析出来的Item 集合。
此外也可以⾃定义FileUpload已完全控制各个Item的存储⽅式,⽐如设置缓存⽬录、直接将接收到的Item以流的形式写⼊数据库等。
FileUpload依赖于Commons IO,因此类路径下要有Commons IO的jar包。
当然采⽤Maven依赖的⽅式不⽤担⼼,maven会⾃动下载Commons IO包。
⼆、FIleUpload使⽤上传⽂件,注意⼏个问题:① form表单内,要添加空间<input type="file" name="myfile">② form表单的内容格式要定义成multipart/form-data格式:<form action="admin/good_add" method="post" enctype="multipart/form-data">③需要类库:1 commons-io.jar ,2 commons-fileupload-1.3.1.jar接下来我们看下他的⽤法。
1)DiskFileItemFactory factory = new DiskFileItemFactory();FileItemFactory可以设置内容:● setRepository(File dir);//设置临时⽂件存储位置。
● setSizeThreshold(long bytes);//设置请求⼤⼩阈值,当请求⼤于该值时,接收到的数据是缓存在磁盘中的,否则直接缓存到内存中。
● setFileCleaningTracker(FileCleaningTracker pTracker);//设置临时⽂件清理跟踪器2)创建核⼼类-⽂件解析对象ServletFileUpload upload = new ServletFileUpload(DiskFileItemFactory factory);ServletFileUpload可以设置内容:● setSizeMax(long bytes);//设置整个请求的最⼤值,⼤于该值时,不允许传送。
commons-fileupload(上传下载)教程
第1个上传组件commons-fileupload=============commons-fileupload ================common-fileupload组件是apache的一个开源项目之一,可以从/commons/fileupload/下载。
该组件简单易用,可实现一次上传一个或多个文件,并可限制文件大小。
-下载后解压zip包,将commons-fileupload-1.1.1.jar,和commons-io-1.2.jar(这里我们用的是更新的版本,但是用法是一样的)复制到tomcat的webapps\你的webapp\WEB-INF\lib\下,如果目录不存在请自建目录。
新建一个servlet: FileUpload.java用于文件上传:package com.drp.util.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import mons.fileupload.*;import java.util.*;import java.util.regex.*;import java.io.*;import mons.fileupload.servlet.*;import mons.fileupload.disk.DiskFileItemFactory;public class FileUpload extends HttpServlet {private String uploadPath = ""; // 用于存放上传文件的目录private File tempPath = new File("D:\\Tomcat5.5\\webapps\\drp1.2\\tempimages\\"); // 用于存放临时文件的目录public void doPost(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException {res.setContentType("text/html; charset=GB18030");PrintWriter out = res.getWriter();System.out.println(req.getContentLength());System.out.println(req.getContentType());DiskFileItemFactory factory = new DiskFileItemFactory();// maximum size that will be stored in memory//允许设置内存中存储数据的门限,单位:字节factory.setSizeThreshold(4096);// the location for saving data that is larger than getSizeThreshold() //如果文件大小大于SizeThreshold,则保存到临时目录factory.setRepository(new File("D:\\Tomcat5.5\\webapps\\drp1.2\\tempimages"));ServletFileUpload upload = new ServletFileUpload(factory);// maximum size before a FileUploadException will be thrown//最大上传文件,单位:字节upload.setSizeMax(1000000);try {List fileItems = upload.parseRequest(req);// assume we know there are two files. The first file is a small// text file, the second is unknown and is written to a file on// the serverIterator iter = fileItems.iterator();// 正则匹配,过滤路径取文件名String regExp = ".+\\\\(.+)$";// 过滤掉的文件类型String[] errorType = { ".exe", ".com", ".cgi", ".asp" }; Pattern p = pile(regExp);String itemNo = "";//文件存放路径while (iter.hasNext()) {FileItem item = (FileItem) iter.next();// 忽略其他不是文件域的所有表单信息if (!item.isFormField()) {String name = item.getName();long size = item.getSize();if ((name == null || name.equals("")) && size == 0)continue;Matcher m = p.matcher(name);boolean result = m.find();if (result) {for (int temp = 0; temp < errorType.length; temp++) { if (m.group(1).endsWith(errorType[temp])) {throw new IOException(name + ": wrong type");}}try {// 保存上传的文件到指定的目录// 在下文中上传文件至数据库时,将对这里改写item.write(new File("d:\\" + m.group(1)));out.print(name+" "+size+"<br>");} catch (Exception e) {out.println(e);}} else {throw new IOException("fail to upload");}}}} catch (IOException e) {out.println(e);} catch (FileUploadException e) {out.println(e);}}public void init() throws ServletException {this.uploadPath = this.getServletConfig().getInitParameter("upload_path");//的到web.xml中的配置文件用于保存上传文件,也可以在已开始定义的时候初始化,不过这样可以通过改动配置文件来改动存放路径,不用该代码,增加了灵活性。
使用FileUpload组件上传文件
使⽤FileUpload组件上传⽂件⼀、进⾏⽂件上传时, 表单需要做的准备1.请求⽅式为 POST:<form action="uploadServlet" method="post" ... >2. 使⽤ file 的表单域: <input type="file" name="file"/>3. 使⽤ multipart/form-data 的请求编码⽅式:<form action="uploadServlet" method="post" enctype="multipart/form-data"> File: <input type="file" name="file"/> <input type="submit" value="Submit"/></form>4. 关于 enctypeapplication/x-www-form-urlencoded:表单 enctype 属性的默认值。
这种编码⽅案使⽤有限的字符集,当使⽤了⾮字母和数字时,必须⽤”%HH”代替(H 代表⼗六进制数字)。
对于⼤容量的⼆进制数据或包含⾮ ASCII 字符的⽂本来说,这种编码不能满⾜要求。
multipart/form-data:form 设定了enctype=“multipart/form-data”属性后,表⽰表单以⼆进制传输数据。
⼆、服务端不能再使⽤ request.getParameter() 等⽅式获取请求信息. 获取不到, 因为请求的编码⽅式已经改为 multipart/form-data, 以⼆进制的⽅式来提交请求信息。
使用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],
因版权原因,仅展示原文概要,查看原文内容请购买。
借助commons-fileupload实现文件上传
借助commons-fileupload实现⽂件上传⼀、⽂件上传的原理分析 1、⽂件上传的必要前提 a、表单的method必须是post b、表单的enctype属性必须是multipart/form-data类型的。
enctype默认值:application/x-www-form-urlencoded 作⽤:告知服务器,请求正⽂的MIME类型 application/x-www-form-urlencoded : username=abc&password=123 ServletRequest.getParameter(String name);该⽅法是专门读取该类型的⽅法 multipart/form-data: 2、借助commons-fileupload组件实现⽂件的上传 a、拷贝jar包:commons-fileupload.jar commons-io.jar b、实现原理 3、乱码问题 a、普通字段的乱码 FileItem.getString(String charset);编码要和客户端⼀致 b、上传的中⽂⽂件名乱码 request.setCharacterEncoding("UTF-8");编码要和客户端⼀致 4、具体实现前台upload.jsp代码如下<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>⽂件上传</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><form action="${pageContext.request.contextPath}/servlet/UploadServlet3" method="post" enctype="multipart/form-data"> name:<input name="name"/><br/>file1:<input type="file" name="f1"/><br/>file2:<input type="file" name="f2"/><br/><input type="submit" value="上传"></form></body></html>后台servlet代码package com.itheima.servlet;import java.io.File;import java.io.IOException;import java.io.PrintWriter;import java.io.UnsupportedEncodingException;import java.util.List;import java.util.UUID;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import mons.fileupload.FileItem;import mons.fileupload.FileUploadBase;import mons.fileupload.FileUploadException;import mons.fileupload.disk.DiskFileItemFactory;import mons.fileupload.servlet.ServletFileUpload;import mons.io.FilenameUtils;//详解public class UploadServlet3 extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();System.out.print(request.getRemoteAddr());boolean isMultipart = ServletFileUpload.isMultipartContent(request);if(!isMultipart){throw new RuntimeException("请检查您的表单的enctype属性,确定是multipart/form-data");}DiskFileItemFactory dfif = new DiskFileItemFactory();ServletFileUpload parser = new ServletFileUpload(dfif);// parser.setFileSizeMax(3*1024*1024);//设置单个⽂件上传的⼤⼩// parser.setSizeMax(6*1024*1024);//多⽂件上传时总⼤⼩限制List<FileItem> items = null;try {items = parser.parseRequest(request);}catch(FileUploadBase.FileSizeLimitExceededException e) {out.write("上传⽂件超出了3M");return;}catch(FileUploadBase.SizeLimitExceededException e){out.write("总⽂件超出了6M");return;}catch (FileUploadException e) {e.printStackTrace();throw new RuntimeException("解析上传内容失败,请重新试⼀下");}//处理请求内容if(items!=null){for(FileItem item:items){if(item.isFormField()){processFormField(item);}else{processUploadField(item);}}}out.write("上传成功!");}private void processUploadField(FileItem item) {try {String fileName = item.getName();//⽤户没有选择上传⽂件时if(fileName!=null&&!fileName.equals("")){fileName = UUID.randomUUID().toString()+"_"+FilenameUtils.getName(fileName);//扩展名String extension = FilenameUtils.getExtension(fileName);//MIME类型String contentType = item.getContentType();if(contentType.startsWith("image/")){//分⽬录存储:⽇期解决// Date now = new Date();// DateFormat df = new SimpleDateFormat("yyyy-MM-dd");//// String childDirectory = df.format(now);//按照⽂件名的hashCode计算存储⽬录String childDirectory = makeChildDirectory(getServletContext().getRealPath("/WEB-INF/files/"),fileName); String storeDirectoryPath = getServletContext().getRealPath("/WEB-INF/files/"+childDirectory);File storeDirectory = new File(storeDirectoryPath);if(!storeDirectory.exists()){storeDirectory.mkdirs();}System.out.println(fileName);item.write(new File(storeDirectoryPath+File.separator+fileName));//删除临时⽂件}}} catch (Exception e) {throw new RuntimeException("上传失败,请重试");}}//计算存放的⼦⽬录private String makeChildDirectory(String realPath, String fileName) {int hashCode = fileName.hashCode();int dir1 = hashCode&0xf;// 取1~4位int dir2 = (hashCode&0xf0)>>4;//取5~8位String directory = ""+dir1+File.separator+dir2;File file = new File(realPath,directory);if(!file.exists())file.mkdirs();return directory;}private void processFormField(FileItem item) {String fieldName = item.getFieldName();//字段名String fieldValue;try {fieldValue = item.getString("UTF-8");} catch (UnsupportedEncodingException e) {throw new RuntimeException("不⽀持UTF-8编码");}System.out.println(fieldName+"="+fieldValue);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}} 5、关于临时⽂件问题 a、DiskFileItemFactory public void setRepository(File repository):设置临时⽂件的存放⽬录 public void setSizeThreshold(int sizeThreshold):设置缓存的⼤⼩ b、 ⽂件上传时,⾃⼰⽤IO流处理,⼀定要在流关闭后删除临时⽂件。
使用Commons-fileupload.jar实现文件的上传和下载
文件上传和下载
javaweb文件上传简单介绍
文件的上传和下载在企业级应用中很常见,javaee通常使用commons-fileupload.jar配合commons-io.jar实现文件的上传下载。
具体实现过程如下
准备相应的jar包,并且导入。
写带有文件表单的上传文件的jsp页面,以及处理的后台servlet。
文件的下载
下载就是向客户端响应字节数据!
原来我们响应的都是HTML字符数据!
把一个文件编程字节数组:使用response.getOutputStream()
文件下载操作,最重要的步骤:两个头一个流
第一个头:Content-type:你传递给客户端的文件是什么MIME类型,例如:image/pjpeg
第二个头;Content-Disosition:它的默认值是inline,表示在浏览器窗口中打开!attachment;filename=xxx
流:要下载的文件数据
Attachment翻译为附件
下载的具体编码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
commons-fileupload-1.0上传组件使用实例.文件上传一个WEB开发的基本功能, 以前做项目的时候,自己写过组件,也用过别人写的组件,感觉效果都不是很好,最的发现commons-fileupload是一个很不错的选择,从功能,文档,技术背景都相当不错.花一天时间. 从API到网上看资料. 终于可以在我的项目中用它了. 在这里做一个总结, 也希望对想用这个组件的朋友有所帮助.FileItem类,它包括了单个表单属性的所有资料,所有表单值都可以通过它来取得.主要有以下方法.具体用途请参考API.void delete()getContentType()getFieldName()getInputStream()getName()getOutputStream()getString()getString(ng.String encoding)isFormField()isInMemory()setFieldName(ng.String name)setFormField(boolean state)write(Java.io.File file)以下是使用的一个实例. 具体方法都可以从commons-fileupload的API文件中找到,不再多说..上传页面;up.jsp<%@ page contentType="text/html; charset=gb2312" language="Java" import="Java.sql.*" errorPage="" %><html><head><title>Untitled Document</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></head><body><form action="up1.jsp" method="post" enctype="multipart/form-data" name="form1"><input name="thisfile" type="file" id="thisfile"><input name="user" type="text" id="user" size="10"><input type="submit" name="Submit" value="Submit"></form></body></html>后端处理页面up1.jsp<%@ page contentType="text/html; charset=gb2312" language="Java" import="Java.sql.*" errorPage="" %><%@ page import="mons.fileupload.*" %><%@ page import="Java.util.*" %><%@ page import="Java.io.*" %><html><head><title>Untitled Document</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></head><body><%try{String dir=request.getRealPath(".");DiskFileUpload fu = new DiskFileUpload();fu.setHeaderEncoding("UTF-8"); //注意如果页面是GBK 不用设置,如果页面是UTF-8那一定要设置//否则会出现乱码fu.setSizeMax(4194304); //设置文件大小.fu.setSizeThreshold(4096); //设置缓冲大小.fu.setRepositoryPath(dir+"/test"); //设置临时目录.List fileItems = fu.parseRequest(request); //解析请求,返回一个集合.Iterator i = fileItems.iterator();while(i.hasNext()){FileItem fi = (FileItem)i.next();if(fi.isFormField()) //这是用来确定是否为文件属性,{String fieldName = fi.getFieldName(); //这里取得表单名String fieldvalue=fi.getString(); //这里取得表单值out.print("<br>");out.print("name:"+fieldName);out.print("value:"+fieldvalue);}else //这里开始外理文件{String fileName = fi.getName(); // 返回文件名包括客户机路径if(fileName!=null)out.print(fileName);out.print("<br>"+fi.getFieldName()); // 打印文件表单名fi.write(new File(dir+"/test/a.jpg")); // 写文件到服务器.}}}}catch(Exception e){}%></body></html>///--------------------------------------------------------------------------------------------------------------------------------可以实现common-fileupload是jakarta项目组开发的一个功能很强大的上传文件组件下面先介绍上传文件到服务器(多文件上传):import Javax.Servlet.*;import javax.servlet.http.*;import java.io.*;import java.util.*;import java.util.regex.*;import mons.fileupload.*;public class upload extends HttpServlet {private static final String CONTENT_TYPE = "text/html; charset=GB2312";//Process the HTTP Post requestpublic void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType(CONTENT_TYPE);PrintWriter out=response.getWriter();try {DiskFileUpload fu = new DiskFileUpload();// 设置允许用户上传文件大小,单位:字节,这里设为2mfu.setSizeMax(2*1024*1024);// 设置最多只允许在内存中存储的数据,单位:字节fu.setSizeThreshold(4096);// 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录fu.setRepositoryPath("c:\\Windows\\temp");//开始读取上传信息List fileItems = fu.parseRequest(request);// 依次处理每个上传的文件Iterator iter = fileItems.iterator();//正则匹配,过滤路径取文件名String regExp=".+\\\\(.+)$";//过滤掉的文件类型String[] errorType={".exe",".com",".CGI",".ASP"};Pattern p = pile(regExp);while (iter.hasNext()) {FileItem item = (FileItem)iter.next();//忽略其他不是文件域的所有表单信息if (!item.isFormField()) {String name = item.getName();long size = item.getSize();if((name==null||name.equals("")) && size==0)continue;Matcher m = p.matcher(name);boolean result = m.find();if (result){for (int temp=0;temp<errorType.length;temp++){if (m.group(1).endsWith(errorType[temp])){throw new IOException(name+": wrong type");}}try{//保存上传的文件到指定的目录//在下文中上传文件至数据库时,将对这里改写item.write(new File("d:\\" + m.group(1)));out.print(name+" "+size+"<br>");}catch(Exception e){out.println(e);}}else{throw new IOException("fail to upload");}}}}catch (IOException e){out.println(e);}catch (FileUploadException e){out.println(e);}}}下面是个html的上传页面:<h1>文件上传演示</h1><form name="uploadform" method="POST" action="/upload" ENCTYPE="multipart/form-data"><table border="1" width="450" cellpadding="4" cellspacing="2" bordercolor="#9BD7FF"><tr><td width="100%" colspan="2">文件1:<input name="x" size="40" type="file"></td></tr><tr><td width="100%" colspan="2">文件2:<input name="y" size="40" type="file"></td></tr><tr><td width="100%" colspan="2">文件3:<input name="z" size="40" type="file"></td></tr></table><br/><br/><table><tr><td align="center"><input name="upload" type="submit" value="开始上传"/></td></tr></table></form>现在介绍上传文件到服务器,下面只写出相关代码:以sql2000为例,表结构如下:字段名:name filecode类型:varchar image数据库插入代码为:PreparedStatement pstmt=conn.prepareStatement("insert into test values(?,?)");代码如下:。