Servlet实现文件上传和下载

本文详细介绍了如何使用Servlet进行文件上传和下载操作。在文件上传中,讲解了前台页面设计与后台服务器代码实现。文件下载部分则讨论了通过超链接直接下载和通过后台程序触发下载的两种方法。

文件上传和下载

1.文件上传

文件上传涉及到前台页面的编写和后台服务器端代码的编写,前台发送文件,后台接收并保存文件,这才是一个完整的文件上传。

1.1 前台页面
    <%--
        文件上传表单
            1. 设置表单提交方式  method="post"
            2. 设置表单类型为二进制表单 enctype="multipart/form-data"
            3. 设置表单元素的name属性值(file文件域)
    --%>
    <form method="post" action="uploadServlet" enctype="multipart/form-data">
        姓名:<input type="text" name="uname"> <br>
        文件:<input type="file" name="myfile"> <br>
        <button>提交</button>
    </form>

1.2后台实现

/**
 * 文件上传
 *  如果提交的表单类型是二进制表单,则需要在Servlet类上添加@MultipartConfig。否则所有的数据都无法获取
 */
@MultipartConfig
@WebServlet("/uploadServlet")
public class UploadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置请求的编码格式
        request.setCharacterEncoding("UTF-8");
        // 接收参数(普通参数)
        String uname = request.getParameter("uname");
        System.out.println("uname:" + uname);
        /**
         * 文件上传
         *      Servlet 将 multipart/form-data 的 POST 请求封装成 Part,通过 Part 对上传的文件进行操作。
         *      getPart(name):name代表的是表单元素(file文件域)的name属性值
         */
        // 得到Part对象
        Part part = request.getPart("myfile");
        // 得到上传文件的名称
        String fileName = part.getSubmittedFileName();
        // 得到项目存放的真实路径 (得到文件想要存放的路径)
        String realPath = request.getServletContext().getRealPath("/upload/");
        // 文件上传
        part.write(realPath + fileName);
    }
}

2.文件下载

文件下载,即将服务器上的资源下载(拷贝)到本地,我们可以通过两种方式下载。
第一种是通过超链接本身的特性来下载;
第二种是通过代码下载。

2.1超链接下载

<%--
    超链接下载
        浏览器遇到能够识别的资源时,会直接打开;遇到无法识别的资源,则会进行下载。
        可以通过设置 download 属性,让超链接进行下载。如果download未设置属性值,则下载的文件名为原文件名;如果设置了属性值,则下载的文件名为download属性值。

--%>
<h2>超链接下载</h2>
<h4>浏览器可以识别的资源</h4>
<a href="test.html">HTML页面</a>
<a href="test.txt">TXT文件</a>
<a href="window_bg.jpg">图片</a>
<h4>浏览器无法识别的资源</h4>
<a href="HBuilder X.lnk">快捷方式</a>
<hr>
<h4>download属性</h4>
<a href="test.html" download>HTML页面</a>
<a href="test.txt" download="demo.txt">TXT文件</a>

<br><hr>
<h2>文件下载</h2>
<form action="downloadServlet">
    文件名:<input type="text" name="fileName">
    <button>下载</button>
</form>

2.2后台实现下载

实现步骤
1. 需要通过 response.setContentType 方法设置 Content-type 头字段的值, 为浏览器无法使用某种方式或激活某
个程序来处理的 MIME 类型,例 如 "application/octet-stream" 或 "application/x-msdownload" 等。
2. 需要通过 response.setHeader 方法设置 Content-Disposition 头的值 为 "attachment;filename=文件名" 
3. 读取下载文件,调用 response.getOutputStream 方法向客户端写入附件内容。
/**
 * 文件下载
 */
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置请求的编码格式
        request.setCharacterEncoding("UTF-8");
        // 接收要下载的文件名
        String fileName = request.getParameter("fileName");
        // 判断文件名是否为空
        if (fileName == null || "".equals(fileName)) {
            System.out.println("请输入要下载的文件名!");
            return;
        }
        // 得到文件存放的路径
        String filePath = request.getServletContext().getRealPath("/");
        // 通过路径得到file对象
        File file = new File(filePath + fileName);
        // 判断文件是否存在且是一个标准文件
        if (file.exists() && file.isFile()) {
            // 设置响应类型 (浏览器无法使用某种方式或激活某个程序来处理的类型)
            response.setContentType("application/x-msdownload");
            // 设置头信息
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            // 得到文件的输入流
            InputStream in = new FileInputStream(file);
            // 得到字节输出流
            ServletOutputStream out = response.getOutputStream();
            byte[] chars = new byte[1024];
            int len = 0;
            while((len = in.read(chars)) != -1) {
                out.write(chars, 0, len);
            }
            out.close();
            in.close();

        } else {
            System.out.println("要下载的文件不存在!");
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值