先导入相应的jar包
commons-fileupload-1.2.1.jar
commons-io-2.0.jar
上传页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form enctype="multipart/form-data" action="${pageContext.request.contextPath}/FileUploadController" method="post">
<input type= "file" name ="filetext"/>
<br><br>
请输入你上传文件的描述:<input type="text" name="dec"/>
<br><br>
<input type="submit" value="上传"/>
</form>
</body>
</html>
上传文件的代码
package bzu.cn.fileloadtest.controller;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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;
@WebServlet("/FileUploadController")
public class FileUploadController extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
String savePath = request.getSession().getServletContext().getRealPath("/WEB-INF/final");
System.out.println(savePath);
// 得到保存文件的临时目录
String tempPath = request.getSession().getServletContext().getRealPath("/WEB-INF/temp");
System.out.println(tempPath);
// 创建保存文件的临时位置
File tempFile = new File(tempPath);
// 判断文件是否存在
if (!tempFile.exists()) {
tempFile.mkdirs();
}
// 创键一个工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置工厂的属性,设置最大的接收文件的大小时100KB
factory.setSizeThreshold(100 * 1024);
// 设置保存文件的临时位置
factory.setRepository(tempFile);
// 创建一个文件上传的解析器
ServletFileUpload servload = new ServletFileUpload(factory);
// 设置上传单个文件的大小
servload.setFileSizeMax(20 * 1024 * 1024);
// 设置字符编码集
servload.setHeaderEncoding("UTF-8");
// 设置文件总打大小
servload.setSizeMax(40 * 1024 * 1024);
servload.setProgressListener(new ProgressListener() {
@Override
public void update(long yiuploadFile, long iuploadFile, int arg2) {
System.out.println("上传的文件大小是" + iuploadFile + "已经上传了" + yiuploadFile);
}
});
// 判断文件上传的编码方式是不是Multipart编码方式
if (!servload.isMultipartContent(request)) {
return;
}
OutputStream out = null;
InputStream in = null;
try {
List<FileItem> fileItem = servload.parseRequest(request);
if (fileItem != null && fileItem.size() > 0) {
for (FileItem f : fileItem) {
if (f.isFormField()) {
// 得到普通表单的名字
String pname = f.getFieldName();
// 得到普通表单属性中的值
String value = f.getString("UTF-8");
} else {
// 得到上传文件的文件名
String name = f.getName();
if (name == null || name.trim().equals("")) {
continue;
}
/*
* 注意,在不同的浏览器上的到的名字的格式不一样 在IE浏览器上得到的名字是绝对路径, 在火狐上是文件名 这里需要对name进行一步的该进
*/
name = name.substring(name.lastIndexOf("\\") + 1);
System.out.println(name);
// 得到上传文件的类型
String type = f.getContentType();
// 拿到文件的总大小
long fileSize = f.getSize();
String houzui = name.substring(name.lastIndexOf(".") + 1);
if (houzui.equals("zip") || houzui.equals("rar")) {
throw new RuntimeException("不能上传压缩文件");
}
String saveFileName = makeFileName(name);
System.out.println(saveFileName);
String realSavePath = makePath(saveFileName, savePath);
out = new FileOutputStream(realSavePath + "\\" + saveFileName);
in = f.getInputStream();
// 建立缓存区,做一个搬运文件数据流的勺子
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
in.close();
out.close();
}
}
}
} catch (FileUploadBase.FileSizeLimitExceededException e) {
System.out.println("单个文件的大小超过范围");
} catch (FileUploadBase.SizeLimitExceededException e) {
System.out.println("总文件的大小超过范围");
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
if (in != null)
in.close();
if (out != null)
out.close();
}
}
private String makePath(String saveFileName, String finalPath) {
int hashCode = saveFileName.hashCode();
int dir1 = hashCode & 0xf;
int dir2 = (hashCode >> 4) & 0xf;
// 用dir1 和dir2 创建新的存储的目录
String dir = finalPath + "\\" + dir1 + "\\" + dir2;
File file = new File(dir);
if (!file.exists()) {
file.mkdirs();
}
System.out.println(dir + "$#^#$^#$^#$%^");
return dir;
}
private String makeFileName(String name) {
return UUID.randomUUID().toString() + "_" + name;
}
}
文件的下载
public class LoadServlet extends HttpServlet{
/**
* 载文件,通过OutputStream输出流
*/
public void doPost(HttpServletRequest request,HttpServletResponse response){
//1.获取要下载的文件的绝对路径
String realPath = this.getServletContext().getRealPath("/load/ceshi.txt");
//2.获取要下载的文件名
String fileName = realPath.subString(realPath.lastIndexOf("\\")+1);
String userAgent = request.getHeader("User-Agent");
//针对IE或者以IE为内核的浏览器:
if (userAgent.contains("MSIE")||userAgent.contains("Trident")) {
fileName = java.net.URLEncoder.encode(fileName, "UTF-8");
} else {
//非IE浏览器的处理:
fileName = new String(fileName.getBytes("UTF-8"),"ISO-8859-1");
}
//3.设置content-disposition响应头控制浏览器以下载的方式打开文件
response.setHeader("content-disposition","attachment;filename="+fileName);
//4.获取要下载的文件输入流
InputStream in = new FileInputStream(realPath);
int len = 0;
//5.创建书缓冲区
byte[] buffer = new byte[1024];
//6.通过response对象获取OutputStream输出流对象
OutputStream os = response.getOutputStream();
//7.将FileInputStream流对象写入到buffer缓冲区
while((len=in.read(buffer))>0){
os.write(buffer,0,len);
}
//8.关闭流
in.close();
os.close();
}