1、导包

核心类:

DiskFileItemFactory – 设置磁盘空间,保存临时文件。只是一个具类。

ServletFileUpload  - 文件上传的核心类,此类接收request,并解析reqeust。

2、设置表单为post,且enctype为multipart/form-data,传递的是字节码

  //req.getParameter("txt");//返回的是null

 <form action='<c:url value="/UpLoad"></c:url>' method="post" enctype="multipart/form-data">
File:<input type="file" name="file" /><br/>
<input type="submit" value="上传" />
</form>

3、Demo    /Upload

 request.setCharacterEncoding("utf-8");
//获取项目的绝对地址
String filepath= getServletContext().getRealPath("/file");
String fileTemp=getServletContext().getRealPath("/temp");
//1、声明工厂类,用于在指定磁盘上设置一个临时目录
/*
* 第一个参数:sizeThreadHold - 设置缓存(内存)保存多少字节数据,默认为10K
* 如果一个文件没有大于10K,则直接使用内存直接保存成文件就可以了。
* 如果一个文件大于10K,就需要将文件先保存到临时目录中去。
* 第二个参数 File 是指临时目录位置
* 或者无参函数
* disk.setSizeThreshold(sizeThreshold);
* disk.setRepository(repository)
* */
DiskFileItemFactory disk=new DiskFileItemFactory(1024*10, new File(fileTemp));
//2、声明,接收上面的临时目录
ServletFileUpload upload=new ServletFileUpload(disk);
//3、解析request
try {
//存储文件信息
List<Map<String, String>> imgs=new ArrayList<Map<String,String>>(); List<FileItem> list=upload.parseRequest(request);
//遍历多个上传文件,如果只有一个上传文件可以用list.get(0)获得
for(FileItem item:list)
{
Map<String, String> map=new HashMap<String, String>(); String fileType= item.getContentType();
if(fileType.contains("image/"))
{
//获取文件名,如果是IE,getFieldName获得全路径D:/xx/xxx.jpg,如果是非IE,只获得文件名xxx.xx.jpg
String fileName=item.getName();
fileName=fileName.substring(fileName.lastIndexOf("\\")+1);
//获取扩展名
String extName=fileName.substring(fileName.lastIndexOf("."));
fileName=UUID.randomUUID().toString().replace("-", "")+extName; //组成新文件名 InputStream in= item.getInputStream();
int size=in.available();//获取文件大小
FileUtils.copyInputStreamToFile(in, new File(filepath+"/"+fileName));//使用工具类copy文件到流中 map.put("name", fileName);
map.put("size", ""+size);
map.put("type",fileType); imgs.add(map);
item.delete();//删除缓存中缓存
}
request.setAttribute("list", imgs);
request.getRequestDispatcher("/show.jsp").forward(request, response);
} } catch (Exception e) {
e.printStackTrace();
} }

如果form表单中有说明,由于表单的enctype在上传文件时必须设为multipart/form-data,这样的话req.getParameter("txt");//返回的是null

我们可以通过item.isFormFielda(),进行判断,分类提取内容

 if(item.isFormField())//如果是text|checkbox|radio|select这个值就是true.
{
String fileName= item.getFieldName();//获取的是文本框的name值
String value= item.getString("utf-8");//获取的是文本框的value值
System.out.println(fileName+"=="+value);
}
else {
    
    //保存文件
  }

在上面有提到,保存文件时,如果文件较大,需要先保存为缓存,在写入到文件中保存,这里可以使用迭代器,提高性能,加快保存速度。

但是这种方法也是有缺点的,由于交换可以在内存中进行,或者使用tomcat的内存分区,所以会比较的占用内存

Demo:

 String filePath=getServletContext().getRealPath("/file");
DiskFileItemFactory disk=new DiskFileItemFactory();
disk.setRepository(new File(getServletContext().getRealPath("/temp")));
try{
ServletFileUpload up=new ServletFileUpload(disk);
FileItemIterator it= up.getItemIterator(request);//返回迭代器
while(it.hasNext()){
FileItemStream itemStream= it.next();
String fileName= itemStream.getName();
fileName=fileName.substring(fileName.lastIndexOf("\\")+1);
InputStream in= itemStream.openStream();
FileUtils.copyInputStreamToFile(in, new File(filePath+"/"+fileName)); }

我们知道,在上传的时候有些需要设置上传文件的大小,我们可以设置全部文件大小上传限制,或者设置单个文件的大小

 ServletFileUpload up=new ServletFileUpload(disk);
//up.setSizeMax(1024*1024*100);//设置同时上传文件的总大小100M
//up.setFileSizeMax(1024*1024*10);//设置每一个文件的最大值10M

这里两个限制大小一般情况下不用同时限制

apache_fileupload实现文件上传_上传多个文件的更多相关文章

  1. class文件直接修改_反编译修改class文件变量

    今天笔者同事遇到一个问题,客户同事的数据库连接信息直接写在代码中,连接的密码改了,但是又没有源代码,所以只能直接修改Java class文件. 记录一下修改步骤: 1.下载JClassLib_wind ...

  2. linux下载文件到本地_把linux服务器的文件下到本地windows

    tar -cvf script.tar scriptsz script.tar 文件夹先要打包,并且要指定打包的名字. 具体:  sz/rz命令:  一般来说,linux服务器大多是通过ssh来进行远 ...

  3. AFNetworking框架_上传文件或图像server

    的文本 XXXXXXXXXX在自己的论点更填写 - (void)uploadImageWithImage:(NSString *)imagePath { //上传其它所需參数 NSString *us ...

  4. Python_tkinter(4)_上传文件

    1.上传单个文件 import tkinter as tk from tkinter import filedialog def upload_file(): selectFile = tk.file ...

  5. js_ajax模拟form表单提交_多文件上传_支持单个删除

    需求场景: 用一个input type="file"按钮上传多张图片,可多次上传,可单独删除,最后使用ajax模拟form表单提交功能提交到指定方法中: 问题:由于只有一个file ...

  6. 简易版php文件上传_超详细详解

    1.php简化版的图片上传(没有各种验证) 1234 <form action="" enctype="multipart/form-data" meth ...

  7. 打造 html5 文件上传组件,实现进度显示及拖拽上传,支持秒传+分片上传+断点续传,兼容IE6+及其它标准浏览器

    老早就注册了博客园帐号,昨天才发现,连博客都没开,Github也是一样,深觉惭愧,赶紧潜个水压压惊`(*∩_∩*)′ 言归正传.大概许多人都会用到文件上传的功能,上传的库貌似也不少,比如(jQuery ...

  8. 利用ThinkPHP自带的七牛云驱动上传文件到七牛云以及删除七牛云文件方法

    一.准备工作 1.注册七牛云账号 2.选择对象储存->创建空间->设置为公开 3.在config配置文件中添加以下代码 'UPLOAD_FILE_QINIU' => array ( ...

  9. PHP之文件的锁定、上传与下载

    小结文件的锁定机制.上传和下载 1.文件锁定 现在都在讲究什么分布式.并发等,实际上文件的操作也是并发的,在网络环境下,多个用户在同一时刻访问页面,对同一服务器上的同一文件进行着读取,如果,这个用户刚 ...

随机推荐

  1. poi简单案例

    //poi api 操作 public static void main(String[] args) {  // TODO Auto-generated method stub  // 创建一个工作 ...

  2. oracle_执行计划_谓词信息和数据获取(access and filter区别) (转)

    These two terms in the Predicate Information section indicate when the data source is reduced. Simpl ...

  3. 【Linux】鸟哥的Linux私房菜基础学习篇整理(十二)

    1. depmod [-Ane]:更新内核模块依赖.参数:无参数:depmod会主动分析目前内核的模块,并重新写入/lib/modules/$(uname -r)/modules.dep中:-A:de ...

  4. Currency Exchange(判断是否有正环)

    Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 16456   Accepted: 5732 Description Seve ...

  5. COJN 0486 800401反质数 呵呵呵呵呵

    800401反质数 难度级别:A: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 将正整数 x 的约数个数表示为 g(x).例如,g(1)=1 ...

  6. uboot mkimage使用详解

    mkimage使用详解uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件. mkimage在制作映象文件的时候,是在原来的可执行映象文件的 ...

  7. 【模拟】HDU 5752 Sqrt Bo

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5752 题目大意: 定义f(n)=⌊√n⌋,fy(n)=f(fy-1(n)),求y使得fy(n)=1. ...

  8. Windows打印管理解决方案

    需求 从需求出发,我们的目的是在电脑上提供一个虚拟打印机,然后让用户选择这个虚拟机打印时产生的中间文件被拦截下来,之后进行进一步处理后在执行真实的打印. Windows打印体系 首先附上查找Windo ...

  9. Linux文件操作学习总结【转载】

    本文转载自: http://blog.csdn.net/xiaoweibeibei/article/details/6556951 文件类型:普通文件(文本文件,二进制文件).目录文件.链接文件.设备 ...

  10. python爬虫__第一个爬虫程序

    前言 机缘巧合,最近在学习机器学习实战, 本来要用python来做实验和开发环境 得到一个需求,要爬取大众点评中的一些商户信息, 于是开启了我的第一个爬虫的编写,里面有好多心酸,主要是第一次. 我的文 ...