FileUpload实现多文件上传与下载
FileUpload实现多文件上传与下载
- 简介
- 1. FileUpload
- 2. 准备工作
- 代码
- 1. 文件上传(UploadFile.java)
- 2. 文件上传 (upload_file.jsp)
- 3. 获取文件名列表 (ListFile.java)
- 4. 文件下载 (DownloadFile.java)
- 5. 文件下载 (download_file.jsp)
- 结果演示
- 1. 文件上传
- 2. 文件下载
- 项目源码
简介
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 stubresponse.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 stubdoGet(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 stubdoGet(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. 文件下载
项目源码
FileUpload实现多文件上传与下载