文件的上传与下载

一、实验目的
掌握Servlet的HttpServletRequest对文件上传的支持;
能够理解文件上传的原理,掌握文件上传与下载的步骤
二、实验要求
1. 基于Servlet的文件上传。
2. 文件的下载。
3. 熟练使用MYEclipse开发
三、实验内容
1、单文件上传
代码:
uploadHttpOne.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form method="post" enctype="multipart/form-data" action="${pageContext.request.contextPath}/uploadHttpOneServlet">
    <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

import util.GetFN;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
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)
@WebServlet(value = "/uploadHttpOneServlet")
public class UploadHttpOneServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应的内容类型
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html:charset=utf-8");
       
        //获取输出对象
        PrintWriter out = response.getWriter();
        //获取Part对象
        Part part = request.getPart("resPath");
        String fileDiscription = request.getParameter("fileDiscription");
        out.write("输入的文件描述:" + fileDiscription + " <br> ");
        //指定上传的文件保存到服务器的uploadFiles目录中
        File uploadFileDir = new File(getServletContext().getRealPath("/uploadFiles"));
        if (!uploadFileDir.exists()) {
            uploadFileDir.mkdir();
        }
        //获得原始文件名
        String oldName = GetFN.getFileName(part);
        out.println("上传文件的原始名:" + oldName + " <br> ");
        out.println("上传文件的大小:" + part.getSize() + " <br> ");
        if (oldName != null) {
            //上传到服务器的uploadFiles目录中
            part.write(uploadFileDir + File.separator + oldName);
        }
        out.println("文件上传到:" + uploadFileDir + File.separator + oldName + " <br> ");
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

执行结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、多文件上传
代码:
uploadHttpMulti.jsp

import util.GetFN;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
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)
@WebServlet(value = "/uploadHttpOneServlet")
public class UploadHttpOneServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应的内容类型
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html:charset=utf-8");
       
        //获取输出对象
        PrintWriter out = response.getWriter();
        //获取Part对象
        Part part = request.getPart("resPath");
        String fileDiscription = request.getParameter("fileDiscription");
        out.write("输入的文件描述:" + fileDiscription + " <br> ");
        //指定上传的文件保存到服务器的uploadFiles目录中
        File uploadFileDir = new File(getServletContext().getRealPath("/uploadFiles"));
        if (!uploadFileDir.exists()) {
            uploadFileDir.mkdir();
        }
        //获得原始文件名
        String oldName = GetFN.getFileName(part);
        out.println("上传文件的原始名:" + oldName + " <br> ");
        out.println("上传文件的大小:" + part.getSize() + " <br> ");
        if (oldName != null) {
            //上传到服务器的uploadFiles目录中
            part.write(uploadFileDir + File.separator + oldName);
        }
        out.println("文件上传到:" + uploadFileDir + File.separator + oldName + " <br> ");
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

UploadHttpMultiServlet.java

import util.GetFN;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
/**
 * Servlet implementation class UploadHttpMultiServlet
 */
@MultipartConfig(maxFileSize = 100*1024)
@WebServlet(value = "/uploadHttpMultiServlet")
public class UploadHttpMultiServlet extends HttpServlet {
	 private static final long serialVersionUID=1L;
	    @Override
	    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	        this.doPost(request, response);
	    }
	    @Override
	    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>");
	        //指定上传的文件保存到服务器的uploadFiles目录中
	        File uploadFileDir = new File(getServletContext().getRealPath("/uploadFiles"));
	        if(!uploadFileDir.exists()){
	            uploadFileDir.mkdir();
	        }
	        //获得Part集合
	        Collection<Part> parts = request.getParts();
	        for (Part part : parts) {
	            //没有选择文件不是文件域
	            if(part==null||!part.getName().contains("resPat")){
	                continue;
	            }
	            //获取原始文件名
	            String oldName = GetFN.getFileName(part);
	            out.println("上传文件的原始名:" + oldName + "<br>");
	            out.println("上传文件的大小:" + part.getSize() + "<br>");
	            if (oldName != null) {
	                //上传到服务器的uploadFiles目录中
	                part.write(uploadFileDir+File.separator+oldName);
	            }
	            out.println("文件上传到:" + uploadFileDir + File.separator + oldName + "<br>");
	        }
	    }

}

执行结果
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3、上传文件的大小限定
在UploadHttpMultiServlet页面添加@MultipartConfig注解来限定上传文件的大小
此处限定100kb的文件,即100*1024字节
在这里插入图片描述
运行后当两个文件中只要有一个文件超过限定大小,两个文件都会上传失败,结果如下
其中第一个文件的大小为300kb,第二个文件的大小为0b。
在这里插入图片描述

当两个文件的大小都小于限定大小,才能上传成功
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、实现文件的下载功能,并解决下载乱码问题
ShowDownServlet.java

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.File;
import java.io.IOException;
/**
 * Servlet implementation class ShowDownServlet
 */
@WebServlet("/ShowDownServlet")
public class ShowDownServlet extends HttpServlet {
	private static final long serialVersionUID = 1l;
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //指定从服务器的uploadFiles目录中下载文件
        File downLoadFileDir = new File(getServletContext().getRealPath("/uploadFiles"));
        //获得目录中的文件
        File[] list = downLoadFileDir.listFiles();
        for (File file : list) {
            System.out.println(list.length);
        }
        request.setAttribute("fileList",list);
        request.getRequestDispatcher("/showInfo.jsp").forward(request,response);
    }
}

showInfo.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <table border="1">
        <tr bgcolor="#f0f8ff">
            <th>文件名称</th>
            <th>下载课件</th>
        </tr>
        <c:forEach var="afile" items="${fileList}">
            <tr>
                <td>${afile.name}</td>
                <td align="center"><a href="${pageContext.request.contextPath}/downloadServlet?resPath=${afile.name}" style="text-decoration:none">下载</a></td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

通过地址http://localhost/showDownServlet运行ShowDownServlet,跳转到showInfo.jsp页面。其中需要添加三个jar包。
在这里插入图片描述

乱码问题的解决需要对下载的文件名安装utf-8进行编码。
首先要新建一个工具类ToUTF8,实现一个静态字符编码转换方法toUTF8String()

DownloadServlet.java

import util.ToUTF8;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@WebServlet(value = "/downloadServlet")
public class DownloadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
    @Override
    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="+ ToUTF8.toUTF8String(aFileName));
            //读入文件
            in=new FileInputStream(downLoadFileDir+File.separator+aFileName);
            //得到响应对象的输出流,用于向客户端输出二进制数据
            out = response.getOutputStream();
            out.flush();
            int aRead=0;
            byte[] bytes = new byte[1024];
            while ((aRead = in.read(bytes)) != -1 & in != null) {
                out.write(bytes,0,aRead);
            }
            out.flush();
            in.close();
            out.close();
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }
}

四、心得体会:
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值