文件下载实现

2022-09-14 15:59:05 浏览数 (1)

实现文件下载步骤

  • 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"));
           }

0 人点赞