首页 > 其他分享 >案例-文件下载

案例-文件下载

时间:2022-08-15 09:35:13浏览次数:57  
标签:文件 String agent filename 案例 import servlet javax 下载

案例-文件下载

文件下载需求

  1. 页面显示超链接
  2. 点击超链接弹出下载提示框
  3. 完成图片文件下载

 

  

分析

  1. 超连接指向的资源如果能够被浏览器解析 则在浏览器中展示,如果不能解析 则弹出下载提示框 不满足需求
  2. 任何资源都必须弹出下载提示框
  3. 使用响应头设置资源的打开方式
    • content-disposition:attachment;filename=xxx

步骤:

  1. 定义页面 编辑超链接href属性 指向Servlet 传递资源名称filename
  2. 定义Servlet
    • 获取文件名称
    • 使用字节输入流加载文件仅内存
    • 指定response的响应头:content-disposition:attchment;filename=xxx
    • 将数据写出到response输出流 

问题:

  • 中文文件问题
    • 解决思路
      • 获取客户端使用的浏览器版本信息
      • 根据不同的版本信息 设置filename的编码方式不同

 

代码实现

html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件下载</title>
</head>
<body>
    <a href="/DownloadServlet?filename=四代目.png">图片1</a>
    <a href="/DownloadServlet?filename=人柱力.png">图片2</a>
</body>
</html>

DownloadServlet类

package com.bai.download;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
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.FileInputStream;
import java.io.IOException;
@WebServlet("/DownloadServlet")
public class DownloadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取请求参数 文件名称
        String filename = req.getParameter("filename");
        //2.使用字节输出流加载文件进行内存
        //2.1找到文件服务器路径
        ServletContext servletContext = this.getServletContext();
        String realPath = servletContext.getRealPath("/img/" + filename);
        //2.2用字节流关联
        FileInputStream fis = new FileInputStream(realPath);
        //3.设置response的响应头
        //3.1设置响应头类型:content-type
        String mimeType = servletContext.getMimeType(filename);//获取文件的mime类型
        resp.setHeader("content-type",mimeType);

        //解决中文文件名问题
        //1.获取user-agent请求头
        String agent = req.getHeader("user-agent");
        //2.使用工具类方法编码文件名即可
        filename=DownloadUtils.getFileName(agent,filename);

        //3.2设置响应头打开方式:content-disposition
        resp.setHeader("content-disposition","attachment;filename="+filename);
        //4.将输入流的数据写出得到输出流中
        ServletOutputStream sos = resp.getOutputStream();
        byte[] buff = new byte[1024*8];
        int len=0;
        while ((len=fis.read(buff))!=-1){
            sos.write(buff,0,len);
        }
        fis.close();

    }

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

工具类

package com.bai.download;

import sun.misc.BASE64Encoder;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class DownloadUtils {
    public static String getFileName(String agent,String filename) throws UnsupportedEncodingException {
        if (agent.contains("MSIE")){
            //IE浏览器
            filename= URLEncoder.encode(filename,"utf-8");
            filename = filename.replace("+"," ");
        }else if (agent.contains("Firefox")){
            //火狐浏览器
            BASE64Encoder base64Encoder = new BASE64Encoder();
            filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8"))+"?=";
        }else{
            //其他浏览器
            filename=URLEncoder.encode(filename,"utf-8");
        }
        return filename;
    }
}

运行结果

标签:文件,String,agent,filename,案例,import,servlet,javax,下载
From: https://www.cnblogs.com/aimz01/p/16587103.html

相关文章

  • 文件中有多个商品id,会重复,取出现最多的10个
    多线程读取文件,map或list存储出现次数,并创建对象封装,最小根堆找出前10个商品publicclassDemo{privatestaticfinalStringregex=",";publicstaticv......
  • jsp_快速入门和jsp案例_改造cookie案例
    JSP的内置对象在JSP页面中不需要获取创建,可以直接使用的对象jsp一共有9个内置对象RequestResponseout:字节输出流对象,可以将数据输出到页面上......
  • 文件上传和下载
    11、文件上传和下载11.1、准备工作文件上传是项目开发中最常见的功能之一,springMVC可以很好的支持文件上传,但是SpringMVC上下文中默认没有装配MultipartResolver,因此......
  • Nodemon 如何实时监听 TypeScript 项目下的文件并热部署?
    首先你的项目要安装ts-node和nodemon:npmi-Dts-nodenodemon在package.json文件中配置运行脚本:"dev":"nodemon--watchsrc/**/*.ts--exec\\\"ts-node\\\"src/ma......
  • Linux下生成core dump文件的配置及对core文件的分析
    目录1.环境配置(core文件生成条件)1.文件路径配置2.core文件大小配置3.可选配置4.参考2.使用gdb对coredump文件进行分析1.环境配置(core文件生成条件)1.文件路径......
  • linux文件描述符
    出现背景一个进程运行时要有输入和输出和其他的,输入就是写内存,输出就是读内存到IO设备,把这段写或读的内存叫做文件,所以就把一切IO设备都虚拟化为了一个文件,也就是一段内存......
  • java实现大文件的拆分与合并
    前言我需要把一个大文件上传到网盘上,由于网盘禁止上传大于4G的文件,所以我想通过Java程序来把大文件分割为小文件后,再上传,等需要的时候,通过程序把文件进行合并即可。一、......
  • 千图,包图,千库网素材不花钱免费下载教程
    国内常用的素材网站,千图网,包图网,千库网,素材岛,我图网。一般的设计师都会在里面挑选素材进行二次创作。但是唯一的缺点是,无奈各网站都需要购买vip才能下载,对于不是经常搞设计......
  • 基于EasyExcel实现的分页数据下载封装
    功能概述主要实现的功能:1.分页查询,避免一次性查询全部数据加载到内存引起频繁FULLGC甚至OOM2.当数据量超过单个工作簿最大行数(1048575)时,自动将数据写入新的工作簿3.支......
  • 基于.NetCore开发博客项目 StarBlog - (17) 自动下载文章里的外部图片
    系列文章基于.NetCore开发博客项目StarBlog-(1)为什么需要自己写一个博客?基于.NetCore开发博客项目StarBlog-(2)环境准备和创建项目基于.NetCore开发博客项目......