文件上传和下载
此示例涉及到的知识点:
1:文件大于设定值,尽心临时文件保存;
2:当前毫秒数重置文件名;
3:对上传文件大小设置限制;
4:上传文件目录管理;
5:超链接方式文件下载;
6:Servlet方式文件下载;
此示例的是Servlet实例:对于获取request和response可用ServletActionContext进行获取
文件上传:
jsp代码:(涉及到文件上传,由于文件大小未知,method一定要用POST,而且要设置属性enctype="multipart/form-data")
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 <!-- 涉及到文件上传,由于文件大小未知,method一定要用POST,而且要设置属性enctype="multipart/form-data" --> 11 <form action="${pageContext.request.contextPath }/registerServlet" method="POST" enctype="multipart/form-data"> 12 姓名<input type="text" name="sdffdfsdfs"><br> 13 年龄<input type="text" name="age"><br> 14 照片<input type="file" name="photo"><br> 15 <input type="submit" value="注册"> 16 </form> 17 18 </body> 19 </html>
Servlet代码:
1 package com.yinfu.servlets; 2 3 import java.io.File; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.io.OutputStream; 8 import java.util.Calendar; 9 import java.util.List; 10 11 import javax.servlet.ServletException; 12 import javax.servlet.annotation.WebServlet; 13 import javax.servlet.http.HttpServlet; 14 import javax.servlet.http.HttpServletRequest; 15 import javax.servlet.http.HttpServletResponse; 16 17 import org.apache.commons.fileupload.FileItem; 18 import org.apache.commons.fileupload.FileUploadException; 19 import org.apache.commons.fileupload.disk.DiskFileItemFactory; 20 import org.apache.commons.fileupload.servlet.ServletFileUpload; 21 22 @WebServlet("/registerServlet") 23 public class RegisterServlet extends HttpServlet { 24 protected void doPost(HttpServletRequest request, HttpServletResponse response) 25 throws ServletException, IOException { 26 //判断是否为multipart请求 27 if(!ServletFileUpload.isMultipartContent(request)){ 28 throw new RuntimeException("当前请求不支持文件上传"); 29 } 30 try { 31 32 //创建一个fileitem工厂 33 DiskFileItemFactory factory = new DiskFileItemFactory(); 34 /** 35 * 设置临时文件的边界值,当文件大于该值,会将文件临时保存到临时文件中,否则直接写入内存; 36 * 临界值设为1M, 单位:字节 37 */ 38 factory.setSizeThreshold(1024*1); 39 //指定临时文件 40 String tempPath=this.getServletContext().getRealPath("/temp"); 41 File temp=new File(tempPath); 42 factory.setRepository(temp); 43 44 //创建文件上传核心组件 45 ServletFileUpload upload = new ServletFileUpload(factory); 46 /** 47 * 当上传文件名中含有中文时,浏览器不同会出现乱码,解决办法:重新设置表头编码就可 48 * upload.setHeaderEncoding("utf-8"); 49 * 设置form表单提交单个文件的大小,每个文件都不能超过次大小 单位:字节 50 * upload.setFileSizeMax(1024*1024*1); 51 * 设置form表单总文件大小,所有文件的综合不能超过此值 单位:字节 52 * upload.setSizeMax(1024*1024*1024*1); 53 */ 54 //解析请求 获取所有的item 55 List<FileItem> items = upload.parseRequest(request); 56 for (FileItem item : items) { 57 //判断item是否为普通表单项 58 if(item.isFormField()){ 59 //得到输入框中的name属性的值 60 String fieldName = item.getFieldName(); 61 //得到输入框中的value属性的值(此处中文会出现乱码,只要在getString()方法内填上需要的编码即可) 62 String fieldValue = item.getString(); 63 System.out.println(fieldName+"="+fieldValue); 64 }else{ 65 String fileName = item.getName(); 66 //对于重名的文件,可以对文件名进行重置(用毫秒代替) 67 long millinTime=System.currentTimeMillis(); 68 String str=fileName.substring(fileName.length()-4); 69 fileName=millinTime+str; 70 /** 71 * 接下来用IO流完成文件的上传 72 */ 73 InputStream is = item.getInputStream(); 74 //获取服务器路径 75 String path=this.getServletContext().getRealPath("/images"); 76 /** 77 * 一个文件夹可以存放65535个文件,是有限的,所以文件多时要进行文件管理 78 * 可以这样的路径:/year/month/day;多级目录管理 79 */ 80 Calendar now=Calendar.getInstance();//日历获取当前系统时间 81 int year= now.get(Calendar.YEAR); 82 int month=now.get(Calendar.MONDAY) + 1; //此处的下标是从0开始的 83 int day=now.get(Calendar.DAY_OF_MONTH); 84 //创建多级目录 85 path=path+"/"+year+"/"+month+"/"+day; 86 //创建此文件判断文件夹是否存在,创建文件夹 87 File dirFile=new File(path); 88 if(!dirFile.exists()){ 89 //多级目录创建调用mkdirs()方法,单目录调用mkdir()方法 90 dirFile.mkdirs(); 91 } 92 //创建目标文件,将来用于保存上传文件,创建数据文件 93 File deskFile = new File(path,fileName); 94 //创建文件输出流 95 OutputStream os=new FileOutputStream(deskFile); 96 //输入流的数据写入到输出流中 97 int len=-1; 98 byte[] buffer=new byte[1024]; 99 while((len=is.read(buffer))!=-1){ 100 os.write(buffer, 0, len); 101 } 102 os.close(); 103 is.close(); 104 105 //删除临时文件,删除所有与item相关的临时文件 106 item.delete(); 107 } 108 } 109 } catch (FileUploadException e) { 110 e.printStackTrace(); 111 } 112 } 113 114 }
文件下载:(超链接方式,Servlet方式)
jsp代码:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 <h1>超链接方式文件下载</h1> 11 浏览器能解析的会直接在浏览器上显示,解析不了的会以附件的形式进行下载 12 <a href="${pageContext.request.contextPath }/resources/aaa.jsp">aaa.jsp</a> <br> 13 <a href="${pageContext.request.contextPath }/resources/bbb.wmv">bbb.wmv</a> <br> 14 <a href="${pageContext.request.contextPath }/resources/ccc.jpg">ccc.jpg</a> <br> 15 <a href="${pageContext.request.contextPath }/resources/ddd.txt">ddd.txt</a> <br> 16 <h1>Servlet方式文件下载,全部以附件的形式进行文件下载</h1> 17 <a href="${pageContext.request.contextPath }/downloadServlet">ccc.jpg</a> <br> 18 </body> 19 </html>
Servlet代码:(这里貌似有个问题,就是图片下载下来之后,图片是半个马赛克性质的)
1 package com.yinfu.servlets; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 6 import javax.servlet.ServletException; 7 import javax.servlet.ServletOutputStream; 8 import javax.servlet.annotation.WebServlet; 9 import javax.servlet.http.HttpServlet; 10 import javax.servlet.http.HttpServletRequest; 11 import javax.servlet.http.HttpServletResponse; 12 13 @WebServlet("/downloadServlet") 14 public class DownloadServlet extends HttpServlet { 15 protected void doGet(HttpServletRequest request, HttpServletResponse response) 16 throws ServletException, IOException { 17 18 String fileName="图片.jpg"; 19 //解决文件名乱码。 20 //打散,根据当前编码打散 21 byte[] bytes = fileName.getBytes("UTF-8"); 22 //重组,以目标编码进行重组,浏览器只认ISO8859-1, 23 //http协议规定浏览器只能传输的ISO8858-1这种字节数据,浏览器接收后会根据当前页面所需编码 24 //再进行第二次编码 25 fileName=new String(bytes,"ISO8859-1"); 26 27 //修改响应的头部属性content-disposition值为attachment,可以在相应头里设置下载后文件的名字 28 response.setHeader("content-disposition", "attachment;fileName="+fileName); 29 30 InputStream is = this.getServletContext().getResourceAsStream("/resources/ccc.jpg"); 31 ServletOutputStream os = response.getOutputStream(); 32 int len=-1; 33 byte[] buffer=new byte[1024]; 34 if((len=is.read(buffer))!=-1){ 35 os.write(buffer,0,len); 36 } 37 //关流 38 os.close(); 39 is.close(); 40 } 41 42 }
原图:
只下载了一半,望各位帮忙,请留言: