您的位置:首页 > 其它

使用FileUpload实现Servlet的文件上传

2018-01-05 19:20 537 查看


简介

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文件

  运行如下:



用到的一些类的说明:

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之前,需要解析请求本身,确保请求实际上是一个文件上传请求可用。

  


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完整代码:

  

  选择一个文件:



输出:



输出的完整内容:

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.servlet.RequestDispatcher;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class UploadFileServlet extends HttpServlet
{
private static final long serialVersionUID
= 56890894234786L;
String saveFolder = "falshFolder";
String saveTempFolder = "falshTempFolder";

@SuppressWarnings("unchecked")
public void doPost(HttpServletRequest
request, HttpServletResponse response)
throws ServletException, java.io.IOException {
request.setCharacterEncoding("UTF-8");

// 文件上傳部分
boolean isMultipart = ServletFileUpload.isMultipartContent(request);

if (isMultipart == true)
{
try {
// 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置上传文件时用于临时存放文件的内存大小,这里是4K.多于的部分将临时存在硬盘
factory.setSizeThreshold(4096);
//设置存放临时文件的目录,web根目录下的ImagesUploadTemp目录
factory.setRepository(new File(request.getRealPath("/")+

saveTempFolder));
// 用配置好的工厂实例化上传组件
ServletFileUpload upload = new ServletFileUpload(factory);

// 得到所有的表单域,它们目前都被当作FileItem
List<FileItem> fileItems = upload.parseRequest(request);
Iterator<FileItem> iter = fileItems.iterator();

// 依次处理每个表单域
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();

if(item.isFormField()){
// 如果item是正常的表单域
String name = item.getFieldName();
String value = item.getString();
System.out.print("表单域名为:"+name+"表单域值为:"+value);

}
else{
// 如果item是文件上传表单域

// 获得文件名及路径
String fileName = item.getName();
if (fileName != null)
{
//获取要上传的文件
File fullFile = new File(item.getName());
String t_ext = fullFile.getName().substring(fullFile.getName().lastIndexOf(".") + 1);

// 如果文件存在则上传
if(fullFile.exists()){
//存放文件的路径
String filePath = request.getRealPath("/") + saveFolder;
long now = System.currentTimeMillis();
// 根据系统时间生成上传后保存的文件名
String name = String.valueOf(now);
File fileOnServer = new File(filePath,
name+"."+t_ext);
item.write(fileOnServer);

System.out.println("文件"+fileOnServer.getName()+"上传成功");

request.setAttribute("fileName", fullFile.getName());
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("the enctype must be multipart/form-data");
}

// 返回原页
RequestDispatcher dispatcher = request
.getRequestDispatcher("index.jsp");
dispatcher.forward(request, response);
return;
}

public void doGet(HttpServletRequest
request, HttpServletResponse response)
throws ServletException, java.io.IOException {
doPost(request, response);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: