本文目录一览:
- java怎么用commons-fileupload实现上传文件
- JAVA中commons-collections-3.2.1.jar包是干什么用的
- [java commons-fileupload上传问题获取文本框值的问题](#java commons-fileupload上传问题获取文本框值的问题)
- java文件上传用commons-fileupload设置缓存临时文件的什么意思,有人还说Java虚拟机分配到的内存只有1
java怎么用commons-fileupload实现上传文件
文件上传步骤:
- 导入jar包
- common-fileupload.jar
- common-io.jar
- 上传jsp页面编辑
<body> <form action="${pageContext.request.contextPath}/servlet/UploadHandleServlet" enctype="multipart/form-data" method="post"> 上传用户:<input type="text" name="username"><br/> 上传文件1:<input type="file" name="file1"><br/> 上传文件2:<input type="file" name="file2"><br/> <input type="submit" value="提交"> </form> </body>
- 消息提示页面(成功or失败)
<body> ${message} </body>
- 处理文件上传的servlet编写
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; 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 org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadBase; import org.apache.commons.fileupload.ProgressListener; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class UploadHandleServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String savePath = this.getServletContext().getRealPath("/WEB-INF/upload"); String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp"); File tmpFile = new File(tempPath); if (!tmpFile.exists()) { tmpFile.mkdir(); } String message = ""; try { DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(1024 * 100); factory.setRepository(tmpFile); ServletFileUpload upload = new ServletFileUpload(factory); upload.setProgressListener(new ProgressListener() { public void update(long pBytesRead, long pContentLength, int arg2) { System.out.println("文件大小为:" + pContentLength + ",当前已处理:" + pBytesRead); } }); upload.setHeaderEncoding("UTF-8"); if (!ServletFileUpload.isMultipartContent(request)) { return; } upload.setFileSizeMax(1024 * 1024); upload.setSizeMax(1024 * 1024 * 10); List<FileItem> list = upload.parseRequest(request); for (FileItem item : list) { if (item.isFormField()) { String name = item.getFieldName(); String value = item.getString("UTF-8"); System.out.println(name + "=" + value); } else { String filename = item.getName(); System.out.println(filename); if (filename == null || filename.trim().equals("")) { continue; } filename = filename.substring(filename.lastIndexOf("\\") + 1); String fileExtName = filename.substring(filename.lastIndexOf(".") + 1); System.out.println("上传的文件的扩展名是:" + fileExtName); InputStream in = item.getInputStream(); String saveFilename = makeFileName(filename); String realSavePath = makePath(saveFilename, savePath); FileOutputStream out = new FileOutputStream(realSavePath + "\\" + saveFilename); byte buffer[] = new byte[1024]; int len = 0; while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } in.close(); out.close(); message = "文件上传成功!"; } } } catch (FileUploadBase.FileSizeLimitExceededException e) { e.printStackTrace(); request.setAttribute("message", "单个文件超出最大值!!!"); request.getRequestDispatcher("/message.jsp").forward(request, response); return; } catch (FileUploadBase.SizeLimitExceededException e) { e.printStackTrace(); request.setAttribute("message", "上传文件的总的大小超出限制的最大值!!!"); request.getRequestDispatcher("/message.jsp").forward(request, response); return; } catch (Exception e) { message = "文件上传失败!"; e.printStackTrace(); } request.setAttribute("message", message); request.getRequestDispatcher("/message.jsp").forward(request, response); } private String makeFileName(String filename) { return UUID.randomUUID().toString() + "_" + filename; } private String makePath(String filename, String savePath) { int hashcode = filename.hashCode(); int dir1 = hashcode & 0xf; int dir2 = (hashcode & 0xf0) >> 4; String dir = savePath + "\\" + dir1 + "\\" + dir2; File file = new File(dir); if (!file.exists()) { file.mkdirs(); } return dir; } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
- 编写web.xml文件(servlet的映射配置)
<servlet> <servlet-name>UploadHandleServlet</servlet-name> <servlet-class>me.gacl.web.controller.UploadHandleServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadHandleServlet</servlet-name> <url-pattern>/servlet/UploadHandleServlet</url-pattern> </servlet-mapping>
注:网上看到的,出处找不到了,望见谅!!
JAVA中commons-collections-3.2.1.jar包是干什么用的
- commons-collections 包的功能 为Java标准的Collections API提供了相当好的补充。在此基础上对其常用的数据结构操作进行了很好的封装、抽象和补充。保证性能的同时大大简化代码。
- commons-collections 包的分类
- Bag:在
org.apache.commons.collections
包中定义的接口,它extends java.util.Collection
,而它的实现类都被放在下面的bag
包中。HashBag
是Bag
接口的一个标准实现。而BagUtils
提供一组static
的方法让调用者获取经过不同装饰后的Bag
实例。 - Buffer:定义在
org.apache.commons.collections
包下面的接口,用于表示按一定顺序除去成员对象的collection如队列等。具体的实现类在org.apache.commons.collections.buffer
包下可以找到。最简单直接的Buffer
实现类是UnboundedFifoBuffer
,提供先进先出的大小可变的队列。而BoundedFifoBuffer
则是对其大小进行了限制,是固定大小的先进先出队列。BlockingBuffer
要在多线程的环境中才能体现出它的价值,尤其是当我们需要实现某种流水线时这个BlockingBuffer
很有用:每个流水线上的组件从上游的BlockingBuffer
获取数据,处理后放到下一个BlockingBuffer
中依次传递。BlockingBuffer
的核心特色通俗点说就是如果你向它要东西,而它暂时还没有的话,你可以一直等待直至拿到为止。PriorityBuffer
则提供比一般的先进先出Buffer
更强的控制力:我们可以自定义Comparator
给它,告诉它怎么判定它的成员的先后顺序,优先级最高的最先走。此外还有执行类型检查的TypedBuffer
、或者不可改变的UnmodifiableBuffer
等等。 - Map:在
java.util.Map
的基础上扩展的接口和类。BidiMap
,直译就是双向Map
,可以通过key
找到value
,也可以通过value
找到key
,这在我们日常的代码-名称匹配的时候很方便:因为我们除了需要通过代码找到名称之外,往往也需要处理用户输入的名称,然后获取其代码。需要注意的是BidiMap
当中不光key
不能重复,value
也不可以。MultiMap
,就是说一个key
不在是简单的指向一个对象,而是一组对象,add()
和remove()
的时候跟普通的Map
无异,只是在get()
时返回一个Collection
,利用MultiMap
,我们就可以很方便的往一个key
上放数量不定的对象,也就实现了一对多。LazyMap
,意思就是这个Map
中的键/值对一开始并不存在,当被调用到时才创建。 - Collection:用也各collection之间的类型转换。典型的是
TypedCollection
,它实际上的作用就是提供一个decorate
方法,我们传进去一个Collection
和需要的类型甄别信息java.lang.Class
,它给我们创建一个全新的强类型的Collection
。(暂无样例代码,以后补充) - Comparator:提供了一些
Comparator
的实现类(都在org.apache.commons.collections.comparators
包下面)BooleanComparator
– 用于排序一组Boolean
对象,指明先true
还是先false
;ComparableComparator
– 用于排序实现了java.lang.Comparable
接口的对象(我们常用的Java类如String
、Integer
、Date
、Double
、File
、Character
等等都实现了Comparable
接口);ComparatorChain
– 定义一组Comparator
链,链中的Comparator
对象会被依次执行;FixedOrderComparator
– 用于定义一个特殊的顺序,对一组对象按照这样的自定义顺序进行排序;NullComparator
– 让null
值也可参与比较,可以设定为先null
或者后null
;ReverseComparator
– 将原有的Comparator
效果反转;TransformingComparator
– 将一个Comparator
装饰为具有Transformer
效果的Comparator
。
- Predicate:它以一个
Object
对象为参数,处理后返回一个boolean
值,检验某个对象是否满足某个条件。Commons Collections也提供了一组定义好的Predicate
类供我们使用,这些类都放在org.apache.commons.collections.functors
包中。当然,我们也可以自定义Predicate
,只要实现这个Predicate
接口即可。 - Transformer:我们有时候需要将某个对象转换成另一个对象供另一组方法调用,而这两类对象的类型有可能并不是出于同一个继承体系的,或者说出了很基本的
Object
之外没有共同的父类,或者我们根本不关心他们是不是有其他继承关系,甚至就是同一个类的实例只是对我们而言无所谓,我们为了它能够被后续的调用者有意义的识别和处理,在这样的情形,我们就可以利用Transformer
。除了基本的转型Transformer
之外,Commons Collections还提供了Transformer
链和带条件的Transformer
,使得我们很方便的组装出有意义的转型逻辑。 - Closure:这一组接口和类提供一个操作对象的
execute
方法,为我们在处理一系列对象时可以将处理逻辑分离出来。ChainedClosure
可以包装一组Closure
作为整体执行;IfClosure
在创建时需要提供给它一个Predicate
和两个Closure
,执行时先做Predicate
判定再决定执行哪一个Closure
;SwitchClosure
跟SwitchTransformer
类似,根据创建时传入的Predicate
组和Closure
组对应执行;WhileClosure
则根据创建时传入的Predicate
做判断,如果为true
则执行Closure
,直到Predicate
返回false
;等等。 - Iterator:
java.util.Iterator
接口定义了标准的Collection
遍历方法,但是如果不做改变的使用它,我们得到的是从头到尾一次性的遍历。假如我们需要循环遍历,假如我们需要遍历某一段,假如我们需要遍历满足某些条件的元素,等等等等,我们就不能完全依赖于这个Iterator
的标准实现了。除非我们宁可在此基础上在调用的代码中多加一些判断,不过这样的话代码就会显得混乱,时间长了就容易变得难以维护。Commons Collections的这一组Iterator
为我们带来了便利。
- Bag:在
java commons-fileupload上传问题获取文本框值的问题
enctype="multipart/form-data"
这样搞了后普通request
失效,commons-fileupload.jar
版本不一样,后台写法不不一样。
1.1以上版本建议这么写,一下版本自己百度:
DiskFileItemFactory dff = new DiskFileItemFactory(); // 创建该对象
dff.setSizeThreshold(1024000); // 指定在内存中缓存数据大小,单位为byte
ServletFileUpload sfu = new ServletFileUpload(dff); // 创建该对象
sfu.setFileSizeMax(5000000); // 指定单个上传文件的最大尺寸(单个文件大小不超过5M)
sfu.setSizeMax(20000000); // 指定一次上传多个文件的总尺寸(总文件大小不超过20M)
FileItemIterator fii = sfu.getItemIterator(request); // 解析request
List uploaditems = sfu.parseRequest(request);
for (int i = 0; i < uploaditems.size(); i++) {
FileItem item = (FileItem) uploaditems.get(i);
item.getString("aaa"); // 此处即为你想要的值,相当于request.getParameter("aaa");
}
java文件上传用commons-fileupload设置缓存临时文件的什么意思,有人还说Java虚拟机分配到的内存只有1
肯定和虚拟机内存有关啊!你是用io流来读写数据,那么内部肯定要为了效率使用Buffer包装流来缓存吧,假如现在要上传一个电影2g,你不设置缓存一次性上传整个文件,Java虚拟机内存总共就那么大点(一般不设置只有64M)肯定要爆啊!你平时的小Demo都只有几kb肯定不用缓存也行啦!