前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >文件下载实现

文件下载实现

作者头像
切图仔
发布2022-09-14 15:59:05
6850
发布2022-09-14 15:59:05
举报
文章被收录于专栏:生如夏花绚烂

实现文件下载步骤

  • 1.获取要下载的文件名
  • 2.读取要下载的文件内容
  • 3.把下载的文件内容返回给客户
  • 4.在回传前,通过响应头告诉客户端返回的数据类型
  • 5.通过响应头告诉客户端收到的数据是要下载的

具体实现 导入 commons-io-1.4.jar

编写Servlet程序

代码语言:javascript
复制
public class FileUpload extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //实现文件下载
        /**
         * 1.获取要下载的文件名
         * 2.读取要下载的文件内容
         * 3.把下载的文件内容返回给客户端
         * 4.在回传前,通过响应头告诉客户端返回的数据类型
         * 5.通过响应头告诉客户端收到的数据是要下载的
         */
        //1.
        String downLoadFileName = "default.jpg";
        //2.读取要下载的文件内容通过ServletContext对象读取
        ServletContext servletContext = getServletContext();
        //开始读取
            //获取mime类型
            String mimeType = servletContext.getMimeType("/file/" + downLoadFileName);
           //2.0告诉客户端服务端返回的数据类型
            resp.setContentType(mimeType);
            //告诉客户端,收到的数据需要下载   attachment:附件 filename表示下载的文件名,客户端下载后的文件名
            resp.setHeader("Content-Disposition","attachment;filename="+downLoadFileName);
           //流的方式读取文件数据 输入流
            InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" + downLoadFileName);
           //2.1获取一个输出流,将数据输出到客户端
            ServletOutputStream outputStream = resp.getOutputStream();
           //2.2 直接将输入流复制成输出流,将数据输出到客户端
            IOUtils.copy(resourceAsStream,outputStream);
    }
}

配置web.xml

代码语言:javascript
复制
   <servlet>
        <servlet-name>FileUpload</servlet-name>
        <servlet-class>com.jsp.web.FileUpload</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>FileUpload</servlet-name>
        <url-pattern>/download</url-pattern>
    </servlet-mapping>

此时基本的文件下载程序完成,但需要解决中文乱码问题 如下代码,客户端不能获取到正常的文件名 ??.jpg

代码语言:javascript
复制
resp.setHeader("Content-Disposition","attachment;filename="测试.jpg");

URLEncoder 解决谷歌浏览器和IE浏览器中文乱码

代码语言:javascript
复制
...
resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode("测试.jpg","UTF-8"));
...

Base64编码解决火狐浏览器中文乱码

代码语言:javascript
复制
resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode("测试.jpg","UTF-8"));

改为如下

代码语言:javascript
复制
resp.setHeader("Content-Disposition","attachment;filename="=?charset?B?xxxx?=")

"=?charset?B?xxxx?=" 说明

=?:编码内容开始

charset :字符集

B:表示BASE64编码

xxxx:表示文件名BASE64编码后的内容

?=:编码内容结束

代码语言:javascript
复制
resp.setHeader("Content-Disposition","attachment;filename==?UTF-8?B?"+ new BASE64Encoder().encode("测试.jpg".getBytes("UTF-8")) +"?=");

判断 User-Agent请求头动态确定编码方式

代码语言:javascript
复制
 if(req.getHeader("User-Agent").contains("FireFox")){
               resp.setHeader("Content-Disposition","attachment;filename==?UTF-8?B?"+ new BASE64Encoder().encode("测试.jpg".getBytes("UTF-8")) +"?=");
           }else{
               resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode("测试.jpg","UTF-8"));
           }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-12-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档