zoukankan      html  css  js  c++  java
  • 文件上传和下载

    此示例涉及到的知识点:

    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 }

    原图:

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

  • 相关阅读:
    Linux let 命令
    perl hash array 嵌套 push
    Perl CGI编程
    Perl关联数组用法集锦
    关于反射和动态代理
    SpringBoot与web开发
    Springboot与日志
    Spring Boot
    SpringBoot的自动配置原理
    Spring MVC执行流程
  • 原文地址:https://www.cnblogs.com/lubolin/p/7461025.html
Copyright © 2011-2022 走看看