FileUpload 是 Apache commons下面的一个子项目,用来实现Java环境下面的文件上传功能,与常见的SmartUpload齐名。
可以通过许多种不同的方式使用组件FileUpload,这个主要取决于你的应用程序。在最简单的情况下,你可以调用单一的方法去解析这个 Servlet Request,然后处理选项列表,并应用到你的应用程序。另一方面,你可能决定自定义FileUpload,实现对选项列表中个别项完全控制。例如:你可以将内容注入到数据库。
这里,我们将描述组件FileUpload的基本原则,并讲解一些简单的、常用的使用模式。FileUpload自定制将在其他地方描述。
组件FileUpload依赖于Commons IO组件,因此在继续之前,要确保在你的工程classpath中有描述页中提到的相应版本。(这里FileUpload版本为:commons- fileupload-1.3.3,Commons IO版本为:commons-io-2.6。
一.upload.jsp
form 的 method 是 post 的;
form 的内容格式要定义为 multipart/form-data 格式;
form 的 文件input 的 type 是 file;
对,这三条是必须的!
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<%@ page import="com.entity.User" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>文件上传</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h1>文件上传</h1>
<%
//获取提示信息
String info = String.valueOf(request.getAttribute("info"));
//如果提示信息不为空,则输出提示信息
if (info != "null") {
out.print(info);
}
//获取登录的用户信息
User user = (User) session.getAttribute("user");
//判断用户是否登录
if (user != null) {
%>
<form method="post" action="<%=request.getContextPath()%>/Upload" enctype="multipart/form-data">
选择一个文件:
<input type="file" name="uploadFile"/>
<br><br>
<input type="submit" value="上传">
</form>
<%
} else {
out.print("<br>对不起,您还没有<a href='loginUser.jsp'>登录</a>!");
}
%>
</body>
</html>
二.Upload.java
package com.control;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
/**
* Created by Ray on 2018/3/16 0016.
**/
public class Upload extends HttpServlet {
//指定目录来存储上传的文件
private static final String PATH = "f:/test";
// 上传配置
private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3; // 3MB
private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB
private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//检查是否为多媒体上传
if(!ServletFileUpload.isMultipartContent(request)){
//如果不是则停止
PrintWriter printWriter = response.getWriter();
printWriter.println("Error: 表单必须包含 enctype=multipart/form-data");
return;
}
//配置上传参数(创建磁盘工厂)
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置内存临界值 - 超过后将产生临时文件并存储于临时目录中
factory.setSizeThreshold(MEMORY_THRESHOLD);
// 创建处理工具
ServletFileUpload upload = new ServletFileUpload(factory);
//设置最大文件上传值
upload.setFileSizeMax(MAX_FILE_SIZE);
//设置最大请求值(包含文件和表单数据)
upload.setSizeMax(MAX_REQUEST_SIZE);
//构造指定目录来存储上传的文件
String uploadPath = PATH;
//如果目录不存在则创建
File uploadDir = new File(uploadPath);
if(!uploadDir.exists()){
uploadDir.mkdir();
}
try{
//解析请求的内容提取文件数据
List<FileItem> formItems = upload.parseRequest(request);
if(formItems != null && formItems.size() > 0){
//迭代表单数据
for(FileItem item : formItems){
//处理不在表单的字段
if(!item.isFormField()){
String fileName = new File(item.getName()).getName();
String filePath = uploadPath + File.separator + fileName;
File storeFile = new File(filePath);
//在控制台输出文件的上传路径
System.out.println(filePath);
//保存文件到硬盘
item.write(storeFile);
request.setAttribute("info","文件上传成功!");
}
}
}
}catch (Exception e){
request.setAttribute("info","错误信息: " + e.getMessage());
}
//跳转到 messageupload.jsp
request.getRequestDispatcher("messageupload.jsp").forward(request,response);
}
}
三.messageupload.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>上传操作</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<link rel="stylesheet" type="text/css" href="css/userStyle.css">
</head>
<body>
<div class="head">上传操作</div>
<div class="out">
<%
//获取提示信息
String info = String.valueOf(request.getAttribute("info"));
//如果提示信息不为空,则输出提示信息
if (info != "null") {
out.print(info);
}
%>
</div>
</body>
</html>
四.pom.xml
1.添加依赖commons-fileupload 和 commons-io
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ray</groupId>
<artifactId>JspDemo</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>JspDemo Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.0.8</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>3.0-alpha-1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
<build>
<finalName>JspDemo</finalName>
</build>
</project>
五.页面效果
ok!