一、要实现Servlet的文件上传和下载,首先需要借助第三方的jar包
二、Servlet的代码
package com.xh.web; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; @WebServlet(name = "DownloadServlet",urlPatterns = {"/download","/upload"}) public class DownloadServlet extends HttpServlet { /** * 文件上传 * @param request * @param response * @throws ServletException * @throws IOException */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //声明工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); //声明上传组件 ServletFileUpload upload = new ServletFileUpload(factory); //指定字符集 upload.setHeaderEncoding("UTF-8"); //获取项目的绝对路劲(根路径) String realPath = this.getServletContext().getRealPath("./"); //File.separator 路径分隔符,不同系统的分隔符不同 //创建文件上传的文件夹“file”,如果文件不存在就创建 File file = new File(realPath+File.separator+"file"); if(!file.isDirectory()){ file.mkdirs(); } try { //获取所有的表单类容 List<FileItem> items =upload.parseRequest(request); for (FileItem f : items) { //判断是否是一个输入元素,false 为文件,true 不是文件 if(!f.isFormField()){ //获取文件名 String fileName = f.getName(); //获取文件后缀 String suffix = fileName.substring(fileName.indexOf(".")); //获取当前时间 Date date = new Date(); //格式化当前时间 SimpleDateFormat format = new SimpleDateFormat("YYMMddHHmmss"); //重新命名文件名,防止重复,因为时间也有可能重复,可加入UUID等随机数据,最大程度防止文件名重复 String newName = format.format(date)+suffix; // UUID.randomUUID() //获取文件类容 byte[] bytes = f.get(); //建立输出流,输出文件 FileOutputStream outputStream = new FileOutputStream(file+File.separator+newName); outputStream.write(bytes); outputStream.close(); } } } catch (FileUploadException e) { e.printStackTrace(); } } /** * 文件下载 * @param request * @param response * @throws ServletException * @throws IOException */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //从前端获取要下载的文件名 String fileName = request.getParameter("filename"); //获取项目的绝对路径 String realPath = this.getServletContext().getRealPath("./"); //获得下载文件的路径,该路径为之前上传的文件 File file = new File(realPath+File.separator+"file"); //拼接文件路径 String fileString = file+File.separator+fileName; //设置字符编码 response.setCharacterEncoding("UTF-8"); //String fileName_encode = URLEncoder.encode(fileName,"UTF-8"); //防止中文乱码 //防止中文乱码,符号乱码等问题 String fileName_encode= new String(fileName.getBytes(),"ISO8859-1"); //设置响应头(重要) response.setHeader("Content-Disposition","attachment; filename="+fileName_encode); //建立输出流 FileInputStream fileInputStream = new FileInputStream(fileString); //建立输出流1 (可用) /* byte[] bytes = new byte[2048]; ServletOutputStream outputStream = response.getOutputStream(); int i = 0; while(( i = fileInputStream.read(bytes))!=-1){ outputStream.write(bytes,0,i); outputStream.flush(); } outputStream.close(); */ //建立输出流2 //获取文件输出流大小 int size = fileInputStream.available(); byte[] bytes = new byte[size]; fileInputStream.read(bytes); ServletOutputStream outputStream = response.getOutputStream(); outputStream.write(bytes); outputStream.close(); } }
三、HTML代码
注意:下载界面的filename为自己上传的(处理后)的文件名,超链接的href路径或form表单的路径根据自己的项目设置
1、文件上传的HTML代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="../upload" method="post" enctype="multipart/form-data"> <input type="file" name="myfile"> <input type="submit"> </form> </body> </html>
2、文件下载的HTML代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <a href="../download?filename=jianli.jpg">jianli.jpg</a> <a href="../download?filename=Java.docx">Java.docx</a> <a href="../download?filename=个人简历.doc">个人简历.doc</a> <img src="../file/jianli.jpg"> <!-- 测试上传图片能否正常显示(相对路径)--> </body> </html>