此示例涉及到的知识点:
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 }
原图:
只下载了一半,望各位帮忙,请留言:
文件上传和下载
原文地址:http://www.cnblogs.com/lubolin/p/7461025.html