JavaWeb简单实例——文件的下载

梦想不抛弃苦心追求的人,只要不停止追求,你们会沐浴在梦想的光辉之中。再美好的梦想与目标,再完美的计划和方案,如果不能尽快在行动中落实,最终只能是纸上谈兵,空想一番。只要瞄准了大方向,坚持不懈地做下去,才能够扫除挡在梦想前面的障碍,实现美好的人生蓝图。JavaWeb简单实例——文件的下载,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

简单介绍:

文件的下载的实现比较简单,主要就是结合响应数据的时候,添加一个特殊的响应头告诉浏览器要保存服务端相应的文件。

代码实现:

package Semester_3.FileDownload;

import org.apache.commons.io.IOUtils;

import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;

@WebServlet(name = "Download" , value = "/Download")
public class Download extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        /*
        * 实现文件下载的基本步骤
        * 1.设置文件名
        * 2.告诉浏览器相应的数据类型
        * 3.设置响应头,告诉浏览器要下载这个文件
        * 4.读取要下载的文件内容
        * 5.将要下载的内容回传给客户端
        * */

//        声明文件名,这里用固定的文件名做演示,在使用的时候可以获取请求信息中的文件名
        String FileName = "998.png";
//        获取ServletContext对象,用来获取文件输入流和设置响应头
        ServletContext servletContext = this.getServletContext();
//        获取文件的类型
        String mimeType = servletContext.getMimeType("/file/" + FileName);
//        打印输出一下文件类型
        System.out.println(mimeType);
//        这是响应的文件类型
        resp.setContentType(mimeType);
//        设置响应头,告诉浏览器要下载这个文件
        resp.setHeader("Content-Disposition","attachment;filename="+FileName);
//        获取文件输入流
        InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" + FileName);
//        获取响应输出流
        ServletOutputStream outputStream = resp.getOutputStream();
//        使用IOUtils工具类的copy方法,传入刚才获取的文件输入流和相应输入流,将内容进行写入到客户端
        IOUtils.copy(resourceAsStream,outputStream);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        this.doGet(req, resp);
    }
}

 解决中文文件名乱码的问题:

在我们尝试将文件名添加中文的时候,会发现中文的文件名会乱码,这时候就需要对原始的文件名进行一层URLEcoder的再次编码封装

代码实现:

package Semester_3.FileDownload;

import org.apache.commons.io.IOUtils;

import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

@WebServlet(name = "Download" , value = "/Download")
public class Download extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        /*
        * 实现文件下载的基本步骤
        * 1.设置文件名
        * 2.告诉浏览器相应的数据类型
        * 3.设置响应头,告诉浏览器要下载这个文件
        * 4.读取要下载的文件内容
        * 5.将要下载的内容回传给客户端
        * */

//        声明文件名,这里用固定的文件名做演示,在使用的时候可以获取请求信息中的文件名
        String FileName = "998.png";
//        获取ServletContext对象,用来获取文件输入流和设置响应头
        ServletContext servletContext = this.getServletContext();
//        获取文件的类型
        String mimeType = servletContext.getMimeType("/file/" + FileName);
//        打印输出一下文件类型
        System.out.println(mimeType);
//        这是响应的文件类型
        resp.setContentType(mimeType);
//        设置响应头,告诉浏览器要下载这个文件
//        在正常状态下,我们传递的文件名如果是中文会乱码,这时候就需要使用URLEncoder的encode方法,对文件名进行一次编码操作,就可以解决中文文件名报错的问题
        resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode("中国.png", "utf-8"));
//        获取文件输入流
        InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" + FileName);
//        获取响应输出流
        ServletOutputStream outputStream = resp.getOutputStream();
//        使用IOUtils工具类的copy方法,传入刚才获取的文件输入流和相应输入流,将内容进行写入到客户端
        IOUtils.copy(resourceAsStream,outputStream);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        this.doGet(req, resp);
    }
}

注意点:

文件的路径:

在我们寻找文件的路径的时候,这个时候的根节点是以web目录为根节点开始出发的,所以这里的文件路径需要格外注意一下。

响应头的含义:

resp.setHeader("Content-Disposition","attachment;filename")

这个响应头的含义是将文件以附件的方式进行存储,并设置存储的文件名。Content-Disposition表示“如何处理这个文件”,attachment表示“附件”,filename的值就是存储时候的文件名

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153339.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!