首页 > 技术文章 > JavaServlet实现下载功能

nanyangke-cjz 2017-07-06 19:26 原文

    我们在项目中经常会用到下载功能,所以今天我们先说下下载功能实现的思路,然后通过一个案例代码来具体体现。

1.下载的思路:

①首先要获取我们要操作的文件对象的路径

②然后使用获取的文件对象路径构建一个文件操作流对象

③设置好相关的http响应的头,告诉浏览器怎么来操作我们写回的数据,是下载、打开等等。

④通过response获取字节流,并结合我们的文件流进行读取和写出操作

⑤关闭相关的流资源

2.下载具体servlet实现代码:

 

package com.servlet;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/download.do")
public class DownloadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * 使用servlet实现文件下载功能
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String fileName = "关系图.jpg";
        OutputStream out = null;
        FileInputStream fis = null;
        // 1.获取资源文件的路径,当文件名是中文的时候出现不正常的情况,所以需要进行url编码
        String path = this.getServletContext().getRealPath("/WEB-INF/classes/com/servlet/" + URLEncoder.encode(fileName, "UTF-8"));
        try {
            // 2.根据获取到的路径,构建文件流对象
            fis = new FileInputStream(path);
            out = response.getOutputStream();
            // 3.设置让浏览器不进行缓存,不然会发现下载功能在opera和firefox里面好好的没问题,在IE下面就是不行,就是找不到文件
            response.setHeader("Pragma", "No-cache");
            response.setHeader("Cache-Control", "No-cache");
            response.setDateHeader("Expires", -1);
            // 4.设置Content-type字段
            response.setContentType("image/jpeg");
            // 5.设置http响应头,告诉浏览器以下载的方式处理我们的响应信息
            response.setHeader("content-disposition", "attachment;filename=" + fileName);
            // 6.开始写文件
            byte[] buf = new byte[1024];
            int len = 0;
            while ((len = fis.read(buf)) != -1) {
                out.write(buf, 0, len);
            }
        } finally {
            if (fis != null) {
                fis.close();
            }

        }

    }

}

 

至此一个简单的servlet实现下载功能已经实现完毕,有不足的地方,希望大家多多提意见!

推荐阅读