5.2其他WEB技术——文件下载

JAVAWEB学习文章索引点这里
文件下载可以使用超链接直接请求资源,但是主要还在servlet中进行操作,这样做更加安全,用户不知道资源的实际位置,也可以增加其他的业务操作。
需要注意的是:
1,以相对路径的方式获取资源,更加灵活点
2,中文文件名获取资源后要进行字符集编码
3,针对不同的浏览器需要设置不同的响应头
4,代码中download文件夹在WebContent下
代码如下:

package com.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

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")
public class Download extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //从服务器磁盘上读取文件
        String fileName = "选课情况.text";
        InputStream in = this.getServletContext().getResourceAsStream("/download/"+fileName);
        fileName = URLEncoder.encode(fileName,"utf-8");//对中文名进行一个utf-8编码
        //设置响应头,告诉浏览器以下载的方式接收资源
        String userAgent = request.getHeader("user-agent");//获取请求的浏览器信息
        String content = "";
        if(userAgent.contains("Triden")) {
            content = "attachment;filename="+fileName;
        }else {
            content = "attachment;filename*="+fileName;
        }
        //设置响应头,不同浏览器的识别方式不同,非ie浏览器需要加上一个*
        response.setHeader("content-disposition", content);
        //发送信息
        OutputStream out = response.getOutputStream();
        byte[] buff = new byte[1024];
        int len = 0;
        while((len = in.read(buff)) != -1) {
            out.write(buff, 0, len);
        }
        out.close();
        in.close();
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

猜你喜欢

转载自blog.csdn.net/smallhc/article/details/81072885
今日推荐