文件上传和下载

Posted 南山南

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件上传和下载相关的知识,希望对你有一定的参考价值。

此示例涉及到的知识点:

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 }

原图:

只下载了一半,望各位帮忙,请留言:

 

以上是关于文件上传和下载的主要内容,如果未能解决你的问题,请参考以下文章

用于从 cloudkit 检索单列的代码模式/片段

大文件上传下载分片断点续传教程

Alamofire 文件上传出现错误“JSON 文本未以数组或对象开头,并且允许未设置片段的选项”

VIM 代码片段插件 ultisnips 使用教程

代码学习PHP文件的上传和下载

SpringMVC_[4]文件上传和下载