案例(web开发):文件下载

文件的下载

客户端浏览器从服务器下载文件。其实就是超链接,连接的地址是服务器端文件的路径
存在一个问题:浏览器能识别的文件,比如图片、视频、音频、pdf、txt等,会直接打开。
解决方案:编写服务器端代码,告诉浏览器,无论文件时什么类型的,都不让浏览器打开,让浏览器以附件的方式打开,直接下载。

以下代码是设置响应头:服务器指导浏览器,把文件以附件的形式下载

                           内容描述            附件
 response.setHeader("Content-Disposition","attachment;filename=文件名");

代码实现:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <!--
        超链接:文件下载
        连接的路径就是服务器文件的地址
    -->
    <a href="/web03/download/a.flv">a.flv</a><br/>
    <a href="/web03/download/a.jpg">a.jpg</a><br/>
    <a href="/web03/download/a.mp3">a.mp3</a><br/>
    <a href="/web03/download/a.mp4">a.mp4</a><br/>
    <a href="/web03/download/a.txt">a.txt</a><br/>
    <a href="/web03/download/a.zip">a.zip</a><br/>
    <a href="/web03/download/a.pdf">a.pdf</a><br/>
    <hr/>
    <!--
        连接的地址,不在是文件的地址,连接某一个Servlet
    -->
    <a href="/web03/download">a.jpg</a><br/>

    <!--
        http://localhost:8080/web03/download.html?a=%E4%BD%A0%E5%A5%BD#
    -->
    <form action="#" method="get">
        <input type="text" name="a"/><input type="submit"/>
    </form>
</body>
</html>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    /*
     * 编写程序,通知浏览器请你下载,不要打开
     * 指导浏览器干什么,响应头
     * 浏览器下载是HTTP协议规定
     */

    String agent = request.getHeader("User-Agent");
    String filename="美女.jpg";
    if (agent.contains("MSIE")) {
        // IE浏览器
        filename = URLEncoder.encode(filename, "utf-8");
        filename = filename.replace("+", " ");
    } else if (agent.contains("Firefox")) {
        // 火狐浏览器
        BASE64Encoder base64Encoder = new BASE64Encoder();
        filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
    } else {
        // 其它浏览器
        filename = URLEncoder.encode(filename, "utf-8");
    }
    //Content-Disposition 内容描述		 	 attachment 附件
    response.setHeader("Content-Disposition","attachment;filename="+filename);
    String aFile = getServletContext().getRealPath("download/a.jpg");
    FileInputStream fis = new FileInputStream(aFile);
    OutputStream out = response.getOutputStream();
    int len = 0;
    byte[] bytes = new byte[1024];
    while ((len = fis.read(bytes))!=-1){
        out.write(bytes,0,len);
    }
    fis.close();
}

猜你喜欢

转载自blog.csdn.net/qq_45083975/article/details/92627481