文件的上传与下载

第一部分

单文件上传

单个文件上传时,在Servlet中可以通过HttpServletRequest对象request调用方法getPart(String name)获得Part文件对象。

编写一个uploadHttpOne.jsp

uploadHttpOne.jsp


<%@ page language="java" contentType="text/html;charset=UTF-8"  pageEncoding="UTF-8" %>
<html>
<head>
  <meta charset="UTF-8">
    <title>HttpServlet对文件上传的支持</title>
</head>
<body>
<form action ="http://localhost:8080/demo/servlet/upload" method="post"  enctype="multipart/form-data">
  <table>
    <tr>
      <td>文件描述:</td>
      <td><input type="text" name="filediscription"></td>
    </tr>
    <tr>
      <td>请选择文件:</td>
      <td><input type="file" name="resPath"></td>
    </tr>
    <tr>
      <td align="right"><input type="reset" value="重填"></td>
      <td><input type="submit" value="上传"></td>
    </tr>
  </table>
</form>
</body>
</html>

编写一个UploadHttpOneServlet.java

UploadHttpOneServlet.java

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;

@MultipartConfig(maxFileSize = 10*1024*1024)
public class UploadHttpOneServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;



    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       response.setContentType("text/html;charset=gb2312");
        PrintWriter out = response.getWriter();
        request.setCharacterEncoding("utf-8");
        Part part = request.getPart("resPath");
        String filediscription = request.getParameter("filediscription");
        out.println("输入的文件描述:"+filediscription+"<br>");
        File uploadFileDir = new File(getServletContext().getRealPath("/uploadFiles"));
        if (!uploadFileDir.exists()){
            uploadFileDir.mkdir();
        }
        String oldName = MyUtil.getFileName(part);
        out.println("上传文件的原始名:"+oldName+"<br>");
        out.println("上传文件的大小:"+part.getSize()+"<br>");
        if (oldName!=null){
            part.write(uploadFileDir+File.separator+oldName);
        }
        out.println("文件上传到:"+uploadFileDir+File.separator+oldName+"<br>");
    }

}

Servlet规范中不提供获取上传文件文件名的方法,但是可以通过Part对象调用GetHeader("content-disposition")方法获取。我们可以讲getFileName(Part part)方法写到一个工具类MyUtil中,方便调用。

MyUtil.java

package servlet;

import javax.servlet.http.Part;

public class MyUtil {
    public  static String getFileName(Part part){
        if(part==null)
            return null;
        String fileName = part.getHeader("content-disposition");
        if(fileName.lastIndexOf("=") + 2 == fileName.length() - 1)
            return null;
        return  fileName.substring(fileName.lastIndexOf("=") + 2,fileName.length() - 1);
    }
}

 xml的配置

<servlet>
    <servlet-name>UploadHttpOneServlet</servlet-name>
    <servlet-class>servlet.UploadHttpOneServlet</servlet-class>
</servlet>
    <servlet-mapping>
        <servlet-name>UploadHttpOneServlet</servlet-name>
        <url-pattern>/servlet/upload</url-pattern>
    </servlet-mapping>

实验运行结果

第二部分

多文件的上传

多文件上传时,在Servlet中可以通过HttpServletRequest对象request调用方法getParts()获得Part文件对象集合。

unloadHttpMulti.jsp


<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
    <meta charset="utf-8">
    <title>对文件上传的支持</title>
</head>
<body>
<form action ="http://localhost:8080/demo/servlet/uhm" method="post"  enctype="multipart/form-data">
    <table>
        <tr>
            <td>文件1描述:</td>
            <td><input type="text" name="filediscription1"></td>
        </tr>
        <tr>
            <td>请选择文件1:</td>
            <td><input type="file" name="resPath1"></td>
        </tr>
        <tr>
            <td>文件2描述:</td>
            <td><input type="text" name="filediscription2"></td>
        </tr>
        <tr>
            <td>请选择文件2:</td>
            <td><input type="file" name="resPath2"></td>
        </tr>
        <tr>
            <td align="right"><input type="reset" value="重填"></td>
            <td><input type="submit" value="上传"></td>
        </tr>
    </table>
    </form>
</body>

</html>

UploadHttpMultiServlet.java

package servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;

@MultipartConfig(maxFileSize = 10*1024*1024)
public class UploadHttpMultiServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        request.setCharacterEncoding("utf-8");
        String filediscription1 = request.getParameter("filediscription1");
        out.println("输入的文件1描述:"+filediscription1+"<br>");
        String filediscription2 = request.getParameter("filediscription2");
        out.println("输入的文件2描述:"+filediscription2+"<br>");
        File uploadFileDir = new File(getServletContext().getRealPath("/uploadFiles"));
        if (!uploadFileDir.exists()){
            uploadFileDir.mkdir();
        }
        Collection<Part>parts = request.getParts();
        for(Part part:parts){
            if(part == null || !part.getName().contains("resPat")){
                continue;
            }
            String oldName = MyUtil.getFileName(part);
            out.println("上传文件的原始名:"+oldName+"<br>");
            out.println("上传文件的大小:"+part.getSize()+"<br>");
            if (oldName!=null){
                part.write(uploadFileDir+File.separator+oldName);
            }
            out.println("文件上传到:"+uploadFileDir+File.separator+oldName+"<br>");
        }
    }
}

xml的配置

<servlet>
        <servlet-name>UploadHttpMultiServlet</servlet-name>
        <servlet-class>servlet.UploadHttpMultiServlet</servlet-class>
    </servlet>
<servlet-mapping>
    <servlet-name>UploadHttpMultiServlet</servlet-name>
    <url-pattern>/servlet/uhm</url-pattern>
</servlet-mapping>

运行结果

上传文件的限定

@MultipartConfig(maxFileSize = 10*1024*1024)

通过加入注解可以设置上传文件的最大值

当超过文件大小的最大值时,会出现以下页面

第三部分

文件下载

实验运行前的准备:导入相关的jar包

1.下载网址:http://tomcat.apache.org/taglibs/standard/

2. 点击download

3.下载 taglibs-standard-impl-1.2.5.jar 和 taglibs-standard-spec-1.2.5.jar

ShowlDownServlet.java

package servlet;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
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.IOException;
@WebServlet("/showDownServlet")
public class ShowDownServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        File downLoadFileDir = new File(getServletContext().getRealPath("/uploadFiles"));
        File[] list = downLoadFileDir.listFiles();
        request.setAttribute("fileList", list);
        RequestDispatcher dis = request.getRequestDispatcher("showInfo.jsp");
        dis.forward(request, response);
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       doGet(request,response);
    }
}

showInfo.jsp


<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri ="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
    <meta charset="utf-8">
    <title>显示下载文件</title>
</head>

<body>
<form action="http://localhost:8080/demo/servlet/uhm" method="post" enctype="multipart/form-data">
<table border="1">
    <tr bgcolor="#90ee90">
        <th>文件名称</th>
        <th>下载课件</th>
    </tr>
    <c:forEach var="afile" items="${fileList}">
        <tr>
      <td>${afile.name}</td>
       <td align="center"><a href="downloadServlet?resPath=${afile.name}"
                           style="text-decoration: none">下载</a></td>
    </tr>
        </c:forEach>
</table>
</form>
</body>
</html>

DownloadServlet.java

package servlet;

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.IOException;

@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
    private static final  long serialVersionUID = 1l;


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        File downLoadFileDir = new File(getServletContext().getRealPath("/uploadFiles"));
        String aFileName =null;
        FileInputStream in = null;
        ServletOutputStream out = null;
        try{
            aFileName = request.getParameter("resPath");
            response.setHeader("Content-Type","application/x-msdownload");
            response.setHeader("Content-Disposition","attachment;filename="+MyUtil.toUTF8String(aFileName));
            in =new FileInputStream(downLoadFileDir+ File.separator+aFileName);
            out =response.getOutputStream();
            out.flush();
            int aRead =0;
            byte b[] =new byte[1024];
            while((aRead=in.read(b))!= -1&in != null){
             out.write(b,0,aRead);
            }
            out.flush();
            in.close();
            out.close();
        }catch (Throwable e){
            e.printStackTrace();
        }
    }
}

 解决文件名乱码问题,在工具类MyUtil.java类中添加一个静态字符编码转换方法

public static  String  toUTF8String(String str){
        StringBuffer sb =new StringBuffer();
        int len = str.length();
        for(int i=0;i<len;i++){
            char c =str.charAt(i);
            if(c>=0&&c<=255){
                sb.append(c);
            }else{
                byte b[];
                try{
                    b= Character.toString(c).getBytes("UTF-8");
                }catch (UnsupportedEncodingException e){
                    e.printStackTrace();
                    b= null;
                }
                for(int j=0;j<b.length;j++){
                    int k= b[j];
                    if(k<0){
                        k&=255;
                    }
                    sb.append("%"+Integer.toHexString(k).toUpperCase());
                }
            }
        }
        return sb.toString();
    }

运行结果

通过地址“http://locallhost:80/demo/showDownServlet”运行ShowDownServlet,跳转到showInfo.jsp页面,结果如下

点击下载,下载的文件默认在C盘用户文件中下载文件夹中。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值