FileUpload实现多文件上传与下载
简介
1. FileUpload
FileUpload 是 Apache commons下面的一个子项目,用来实现Java环境下面的文件上传功能,与常见的SmartUpload齐名。
2. 准备工作
完成文件上传需要导入commons-fileupload-1.3.2.jar,commons-io-2.5.jar两个包
在遍历文件名列表时,需要jstl标签,所以要导入jstl.jar,standard.jar两个包
代码
1. 文件上传(UploadFile.java)
package com.demo;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* Servlet implementation class UploadFile
*/
@WebServlet("/UploadFile")
public class UploadFile extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public UploadFile() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload fileUpload = new ServletFileUpload(factory);
String path = this.getServletContext().getRealPath("/upload");
File folder = new File(path);
if (!folder.exists()) {//如何文件夹不存在就创建
folder.mkdirs();
}
try {
List<FileItem> fileItems = fileUpload.parseRequest(request);// 解析请求
for (FileItem fileItem : fileItems) {
if (!fileItem.isFormField()) {// 判断是否是文件
String fileName = new File(fileItem.getName()).getName();
if (fileName.trim()=="") {// 判断选择了文件,否则重新回到上传页面
out.print("<script>");
out.print("alert('还未选择文件!');");
out.print("location.href='" + request.getContextPath() + "/upload_file.jsp'");
out.print("</script>");
} else {
String name = fileItem.getFieldName();
fileName = UUID.randomUUID().toString() + "_" + fileName;
File file = new File(path +File.separator+ fileName);
fileItem.write(file);
if (file.exists()) {//判断文件是否存在
out.write("文件上传成功!<br>");
out.write("文件参数名为:"+name+",文件名为:"+fileName + "<br>");
out.write("文件的绝对路径:"+file.getAbsolutePath() + "<br>");
}
}
} else {
String name = fileItem.getFieldName();//获取普通参数的字段名
String value = fileItem.getString("UTF-8");//获取普通参数的value值,防止中文乱码
out.write("普通参数名为:"+name+",参数值为:"+value + "<br>");
}
}
out.write("<a href="+ request.getContextPath() + "/ListFile>去下载</a>");
} catch (
Exception e) {
e.printStackTrace();
}
}
}
2. 文件上传 (upload_file.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="UploadFile" method="post" enctype="multipart/form-data">
<table style="width:600px">
<tr>
<td>上传者</td>
<td><input type="text" name="name" /></td>
</tr>
<tr>
<td>上传文件</td>
<td><input type="file" name="filename" multiple="multiple" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="上传" /></td>
</tr>
</table>
</form>
</body>
</html>
3. 获取文件名列表 (ListFile.java)
package com.demo;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ListFile
*/
@WebServlet("/ListFile")
public class ListFile extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ListFile() {
super();
// TODO Auto-generated constructor stub
}
private ArrayList<String> getFileList(String path) {//获取指定目录下的所有文件的文件名
ArrayList<String> filelist = new ArrayList<String>();//保存文件名
File file = new File(path);
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {//判断是否是文件
filelist.add(files[i].getName());
}
if (files[i].isDirectory()) {//判断是否是文件夹
this.getFileList(files[i].getPath());
}
}
return filelist;
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
// 下载文件所在目录
String path=this.getServletContext().getRealPath("/upload");
ArrayList<String> filelist = this.getFileList(path);//调用方法,获取文件名列表
request.setAttribute("filelist", filelist);
request.getRequestDispatcher("download_file.jsp").forward(request, response);
}
/**
* @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);
}
}
4. 文件下载 (DownloadFile.java)
package com.demo;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class DownloadFile
*/
@WebServlet("/DownloadFile")
public class DownloadFile extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public DownloadFile() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
OutputStream out = response.getOutputStream();
// 获取所要下载的文件名称
String filename = request.getParameter("filename");
// 下载文件所在目录
String folder = this.getServletContext().getRealPath("/upload");
// 通知浏览器以下载的方式打开
response.addHeader("Content-Type", "application/octet-stream");
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "utf-8"));
// 通过文件流读取文件
InputStream in = new FileInputStream(folder + File.separator + filename);
byte[] buffer = new byte[1024];
while (in.read(buffer) > 0) {
out.write(buffer);
}
}
/**
* @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);
}
}
5. 文件下载 (download_file.jsp)
<%@ 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>文件下载</title>
</head>
<body>
<c:forEach var="file" items="${filelist}">
${file}<a href="DownloadFile?filename=${file}">下载</a>
<br />
</c:forEach>
</body>
</html>
结果演示
1. 文件上传
2. 文件下载