简介

FileUpload 是 Apache commons下面的一个子项目,用来实现Java环境下的文件上传功能。

FileUpload链接

FileUpload 是基于Apache的Commons IO的,所以在使用之前需要先在BuildPath种添加Commons IO。

Commons IO链接


1.在项目种添加Commons IO和FileUpload

1.1下载Commons IO的最新版本

链接

1.2下载FileUpLoad的最新版本

链接

注:tar.gz是linux版本的

1.3分别把两个jar文件复制到项目文件夹下

个人喜欢放在WEB-INF>lib下:

分别对两个jar文件执行如下操作:

注意:两个jar文件都要Add to Build Path,另外别忘了在java文件里还要import


2.按照Apache官网给出的指导使用文件上传

官网指导链接

2.0在html文件或者jsp文件里创建一个上传文件的表单

这里我创建的是一个jsp文件

<%@  page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>文件上传</h1> <form method="POST" enctype="multipart/form-data" action="UpLoadFile" name="uploadForm">
选择一个文件: <input type="file" name="upfile"><br/>
<br/>
<input type="submit" value="上传">
</form> </body>
</html>

  运行如下:

用到的一些类的说明:

DiskFileItemFactory——工厂类

ServletFileUpload——用于解析resquest,能从resquest中解析出装有FileItem对象的一个List

FileItem——每个FileItem的实例都包含一个文件以及该文件的其他一些属性(文件名、大小等)

注意:以下部分翻译自官网指导。原文链接

2.1使用FileUpload

FileUpload可以通过多种不同的方式使用,具体的使用方式取决于您的应用要求。最简单的方式,您将调用一种方法来解析servlet请求到一个List中。

2.2FileUpLoad是如何运行的

FileUpload可以解析一个请求(request),并向应用程序提供上传的items(上传的文件表单项目)的一个List。每个文件项目(items)都有一些你的应用程序可能感兴趣的属性,例如name、content type,每个items还能提供一个“InputStream”。

FileUpload使用FileItemFactory类来创建新的items,FileUpload附带的FileItemFactory类的实例将项目的数据存储在内存或磁盘上,具体取决于项目的大小(即数据字节数)。但是,可以自定义此行为。

2.3解析请求

在使用上传的items之前,需要解析请求本身,确保请求实际上是一个文件上传请求可用。

// Check that we have a file upload request

boolean isMultipart = ServletFileUpload.isMultipartContent(request);

  

2.4最简单的一种使用情况

  • 只要上传的项目足够小,应保留在内存中。
  • 较大的项目应写入磁盘上的临时文件。
  • 不应该允许非常大的上传请求。
  • 内存中默认保留的内容的最大容量,上传请求的最大允许大小以及临时文件的位置是可以接受的(这一句是Google翻译的)
// 创建工厂(这里用的是工厂模式)
DiskFileItemFactory factory = new DiskFileItemFactory();
//获取汽车零件清单与组装说明书(从ServletContext中得到上传来的数据)
ServletContext servletContext = this.getServletConfig().getServletContext();
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
//工厂把将要组装的汽车的参数录入工厂自己的系统,因为要根据这些参数开设一条生产线(上传来的文件的各种属性)
factory.setRepository(repository);
//此时工厂中已经有了汽车的组装工艺、颜色等属性参数(上传来的文件的大小、文件名等)
//执行下面的这一行代码意味着根据组装工艺等开设了一条组装生产线
ServletFileUpload upload = new ServletFileUpload(factory);

 这样我门就获得了一个List。

Servlet完整代码:

package com.feipeng8848;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List; import javax.servlet.ServletContext;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload; /**
* Servlet implementation class UpLoadExcelServlet
*/ public class UpLoadExcelServlet extends HttpServlet {
private static final long serialVersionUID = 1L; /**
* @see HttpServlet#HttpServlet()
*/
public UpLoadExcelServlet() {
super();
// TODO Auto-generated constructor stub
} /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html>\n");
out.println("<head><title>PageTitle</title></head>");
out.println("<body>");
out.println("<p>文件已经上传成功</p>");
out.println("</body>");
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
System.out.println("doPost"); boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (isMultipart) {
System.out.println("True"); // 创建工厂(这里用的是工厂模式)
DiskFileItemFactory factory = new DiskFileItemFactory();
//获取汽车零件清单与组装说明书(从ServletContext中得到上传来的数据)
ServletContext servletContext = this.getServletConfig().getServletContext();
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
//工厂把将要组装的汽车的参数录入工厂自己的系统,因为要根据这些参数开设一条生产线(上传来的文件的各种属性)
factory.setRepository(repository);
//此时工厂中已经有了汽车的组装工艺、颜色等属性参数(上传来的文件的大小、文件名等)
//执行下面的这一行代码意味着根据组装工艺等开设了一条组装生产线
ServletFileUpload upload = new ServletFileUpload(factory); //解析请求
try {
//把零件送给生产线,出来的就是一辆组装好的汽车(把request转成FileItem的实例)
List<FileItem> items = upload.parseRequest(request);
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) {
FileItem item = iter.next();
//创建文件输出流
File file=new File("D:\\b.xlsx");
if(!file.exists())
{
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
FileOutputStream fos=new FileOutputStream(file);
//创建输入流
InputStream fis=(InputStream) item.getInputStream();
//从输入流获取字节数组
byte b[]=new byte[1];
//读取一个输入流的字节到b[0]中
int read=fis.read(b);
while(read!=-1)
{
fos.write(b,0,1);
read=fis.read(b);
}
fis.close();
fos.flush();
fos.close();
//打印List中的内容(每一个FileItem的实例代表一个文件,执行这行代码会打印该文件的一些基本属性,文件名,大小等)
System.out.println(item);
}
System.out.println("循环输出完成");
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else {
System.out.println("False");
}
}
}

  

  选择一个文件:

输出:

输出的完整内容:

doPost
True
name=PRICIPLE_k.png, StoreLocation=C:\Users\k\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\DBControler\upload_cae42561_32ce_45d4_9009_
ec94523a4b02_00000000.tmp, size=24914 bytes, isFormField=false, FieldName=upfile
循环输出完成

使用FileUpload实现Servlet的文件上传的更多相关文章

  1. Servlet实现文件上传

    一.Servlet实现文件上传,需要添加第三方提供的jar包 下载地址: 1) commons-fileupload-1.2.2-bin.zip      :   点击打开链接 2) commons- ...

  2. Servlet实现文件上传,可多文件上传

    一.Servlet实现文件上传,需要添加第三方提供的jar包 接着把这两个jar包放到 lib文件夹下: 二: 文件上传的表单提交方式必须是POST方式, 编码类型:enctype="mul ...

  3. jsp+servlet实现文件上传下载

    相关素材下载 01.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  4. java commons-fileupload servlet 多文件上传

    commons-fileupload servlet 多文件上传 需要引入的 jar 包. commons-fileupload-1.3.2.jar commons-io-2.2.jar 工程路劲:查 ...

  5. 配置servlet支持文件上传

    Servlet3.0为Servlet添加了multipart配置选项,并为HttpServletRequest添加了getPart和getParts方法获取上传文件.为了使Servlet支付文件上传需 ...

  6. servlet web文件上传

    web文件上传也是一种POST方式,特别之处在于,需设置FORM的enctype属性为multipart/form-data. 并且需要使用文件域. servlet的代码比较关键是这几句: // 使用 ...

  7. 通过JSP+servlet实现文件上传功能

    在TCP/IP中,最早出现的文件上传机制是FTP.它将文件由客户端到服务器的标准机制. 但是在JSP中不能使用FTP来上传文件,这是有JSP的运行机制所决定的. 通过为表单元素设置Method=&qu ...

  8. Servlet之文件上传

    上传表单中的注意事项: 表单 method 属性应该设置为 POST 方法,不能使用 GET 方法 表单 enctype 属性应该设置为multipart/form-data 下面的实例是借助于com ...

  9. Servlet中文件上传下载

    1.文件下载: package FileUploadAndDown; import java.io.FileInputStream; import java.io.IOException; impor ...

随机推荐

  1. Kali Linux信息收集工具

    http://www.freebuf.com/column/150118.html 可能大部分渗透测试者都想成为网络空间的007,而我个人的目标却是成为Q先生! 看过007系列电影的朋友,应该都还记得 ...

  2. (转)java之Spring(IOC)注解装配Bean详解

    java之Spring(IOC)注解装配Bean详解   在这里我们要详细说明一下利用Annotation-注解来装配Bean. 因为如果你学会了注解,你就再也不愿意去手动配置xml文件了,下面就看看 ...

  3. Java基础:JVM垃圾回收算法

    众所周知,Java的垃圾回收是不需要程序员去手动操控的,而是由JVM去完成.本文介绍JVM进行垃圾回收的各种算法. 1. 如何确定某个对象是垃圾 1.1. 引用计数法 1.2. 可达性分析 2. 典型 ...

  4. Scrapy爬虫框架第三讲(linux环境)

    下面我们来学习下Spider的具体使用: 我们已上节的百度阅读爬虫为例来进行分析: 1 # -*- coding: utf-8 -*- 2 import scrapy 3 from scrapy.li ...

  5. BOM和DOM的区别

    一.BOM和DOM之间的关系图 window对象是BOM的顶层(核心)对象,所有对象都是通过它延伸出来的,也可以称为window的子对象由于window是顶层对象,因此调用它的子对象时可以不显示的指明 ...

  6. CSS中的变形、过渡、动画效果

    一.变形 .过渡效果 1:元素平移 x方向 y方向 transform:translate(100px 100px); 2:过渡动画效果 a:什么属性参与过渡效果 b:过渡时间 c:过渡的效果 值包含 ...

  7. 小程序从后台输出的代码为HTML实体字符如何解决?

    最近在做一个小程序的考试系统,从后台调出的数据是这个样子的 那么我遇到这个问题的时候想到的微信小程序的富文本即(wxParse),使用过wxParse的都知道,富文本必须得具体到单个的数据上才能使用, ...

  8. 计算机协议、标准以及OSI模型的简单介绍

    由概念启发学习,引导学习.本篇文章中包含了一些最基本的概念和底层知识.虽然零碎,但是这是基础. 一.协议和标准 协议指的是一组控制数据通信的规则.协议有三要素:语法(syntax),语义(semant ...

  9. 怎么确定Oracle客户端安装成功

    可通过能否登录sqlplus来判断是否安装成功. 操作系统:windows10 oracle版本:oracle 11g 步骤: 1.电脑win键+R键,输入cmd,进入命令提示符. 2.命令行中输入: ...

  10. MySQL性能调优——锁定机制与锁优化分析

    针对多线程的并发访问,任何一个数据库都有其锁定机制,它的优劣直接关系着数据的一致完整性与数据库系统的高并发处理性能.锁定机制也因此成了各种数据库的核心技术之一.不同数据库存储引擎的锁定机制是不同的,本 ...