19. JSP - 实现文件下载

文件下载

超链接下载
超链接下载是指,将下载资源作为超链接的链接目的文件出现。若浏览器可以解析该资源文件,则将在浏览器上直接显示文件内容;若浏览器不支持该文件的解析,则会弹出另存为对话框,要求用户保存。

在Web文件夹下创建download文件夹,里面放入一些文件。

创建html:

 html这样写:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <a href="dowload/bihu.png">下载图片</a>    <!-- 浏览器可以解析的直接打开 -->
    <a href="dowload/bihu.exe">下载bihu社区</a>
</body>
</html>

---------------------------------------------------------

jsp这样写:【加个斜杠】

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <a href="${ pageContext.request.contextPath }/dowload/bihu.png">下载图片</a>    <!-- 浏览器可以解析的直接打开 -->
    <a href="${ pageContext.request.contextPath }/dowload/bihu.exe">下载bihu社区</a>
</body>
</html>

文件路径自己配 你完全也可以用方法 获取文件路径。

目录不要放在eclipse服务器的文件哪里,最好就放在WebContext 文件夹下【和jsp/html 一个目录】,因为每次部署Tomcat时候 会重新部署 那你文件就没了。【意思是叫你下载的文件放在webContext下,或其他,【具体服务器我不知道 反正Eclipse是这样的】】


其实还是那句话: 搞清楚文件路径 实在不行用方法去打印出来查看!

这种方式适用于那种很直接的下载,有点内个了,我们用Servlet进行下载:

 先来个JSP:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <a href="${ pageContext.request.contextPath }/dowload">下载bihu.png【Servlet附件下载】</a>
</body>
</html>

Servlet:

package dowload;

import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class dowload extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置一下编码 防止各方面的乱码【这里推荐在过滤器写】
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
        
        //设置响应头属性【和浏览器说 这是已文件的形式下载!】
        //注意这个格式别写错了  照着拷贝就好了:
        //response.setHeader("content-disposition", "attachment;filename=文件名字");
        
        /*
         *     中文的文件名乱码!! 用new String() 解决!!!! 添加头没用的!:
         * */
        String FileName = "壁虎本人图片.png";
        FileName = new String(FileName.getBytes("UTF-8"),"iso8859-1");                    //利用new String 转换编码!!! 很重要!
        response.setHeader("content-disposition", "attachment;filename=" + FileName);
        
        //获取输入流【在服务器本目录下获取】
        //getResourcePaths:获取WebContent中的文件路径
        InputStream is =  this.getServletContext().getResourceAsStream("/dowload/bihu.png");
        //获取输出流
        ServletOutputStream out = response.getOutputStream();
        
        //传递文件出去
        byte[] bytes = new byte[1024];
        int len = -1;
        while ((len = is.read(bytes)) != -1) {
            //直接写出去即可!
            out.write(bytes,0,len);
        }
        
        
        
    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
    }

}

解决文件名乱码详解:

用内个什么设置头编码没用的【那个对上传文件的文件名乱码就有用】  因为文件名不是哪里传过来的 我们是往外传 所以:

只需将文件名设置编码即可:

String fileName = "壁虎小时候的照片.png";
fileName = new String(fileName.getBytes("utf-8"),"iso8859-1");
//设置响应头属性值,使文件以附件形式进行下载
response.setHeader("content-disposition", "attachment;filename="+fileName);

完.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值