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

简单介绍:

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

代码实现:

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的值就是存储时候的文件名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
java源码包实例源码JAVA开发源码50个合集: Ajax框架 ZK.rar Java图书馆管理系统源程序.rar Java图片倒影效果实例源码.rar Java图片翻折,将图像压扁.rar Java坦克大战网络对战版源代码.rar Java声音播放程序源代码.rar JAVA实现CLDC与MIDP底层编程的代码.rar Java实现HTTP连接与浏览,Java源码下载.rar Java实现的FTP连接与数据浏览程序.rar Java实现的放大镜效果附有源文件.rar Java实现的点对点短消息发送协议(smpp)开发包源码.rar Java实现的视频播放程序源码.rar Java实现移动的遮照效果.rar JAVA实现超级玛丽.zip Java实现跟踪鼠标运行坐标的源码.rar Java手机与计算机互发彩信源码.rar Java手机游戏大富翁源代码+注释.rar Java手机短信项目源码.rar Java扫雷源码.rar Java生成自定义控件源代码.rar Java调色板面板源代码.rar Java跳棋(基于SWT).rar Java通讯录手机版源码.rar Java鼠标拖拽功能.rar 乐趣大型购物系统.rar 可实现网上对战和人机对战.rar 基于BS结构的Java可视化工作流定制软件.rar 基于J2ME的Java游戏梦幻炸弹人源程序.rar 基于JAVA的ICQ系统.rar 基于Java的mp3播放器源代码.rar 基于Java的小型人事管理系统,带数据库.rar 基于JAVA的日程提醒簿.rar 基于Java的邮件服务器源程序.rar 基于MVC的Java资源管理器 v2.0.rar 基于smpp协议的Java点对点短信发送源码包.rar 季风进销存管理系统(JSP版).rar 客户管理系统 Alfresco Content Management.rar 家庭多媒体播放器.rar 局域网广播系统java源码.rar 开源Winzip压缩工具Java版源码.rar 很不错的Java计算器.rar 很强的Java加密解密算法源码.rar 泡泡堂战车游戏JAVA版源码.rar 简单模拟的J2ME潜艇大战源代码.rar 简单的注册与登录功能.rar 类似QQ的聊天软件JAVA版源码(附设计文档).rar 进程通信.rar 连接postsql数据库的java代码.rar 附加数据库.rar 雷电游戏JAVA版源程序.rar

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值