• 目的:完成javaweb的文件下载
<!--如果想要一个a标签点击后不论文件类型,都需要弹出下载,保存框;-->
<!--我们就需要创建一个servlet,让这个a标签指向servlet,而资源用参数的形式传入servlet-->
<!--1. 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框。不满足需求-->
<!--2. 任何资源都必须弹出下载提示框-->
<!--3. 使用响应头设置资源的打开方式:-->
<!--* content-disposition:attachment;filename=xxx-->
成功运行图:
(当然没有第二个avi的文件,因为只要本地有就可以 所以就那img来举例子啦)


注意:由文件结构决定自己的路径哈!记得命名别错了,如果404了,可以查一下这里~

  • 代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--如果想要一个a标签点击后不论文件类型,都需要弹出下载,保存框;-->
<!--我们就需要创建一个servlet,让这个a标签指向servlet,而资源用参数的形式传入servlet-->
<!--1. 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框。不满足需求-->
<!--2. 任何资源都必须弹出下载提示框-->
<!--3. 使用响应头设置资源的打开方式:-->
<!--* content-disposition:attachment;filename=xxx--> <!--* 步骤:-->
<!--1. 定义页面,编辑超链接href属性,指向Servlet,传递资源名称filename-->
<!--2. 定义Servlet-->
<!--1. 获取文件名称-->
<!--2. 使用字节输入流加载文件进内存 需要绝对路径的问题~-->
<!--3. 指定response的响应头: content-disposition:attachment;filename=xxx-->
<!--4. 将数据写出到response输出流-->
<a href="img/1.jpg" >tu1</a><hr>
<a href="/downloadServlet?filename=1.jpg"> JPG </a><hr>
<a href="/downloadServlet?filename=1.avi"> VIDEO</a>
</body>
</html>

download.html

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 {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求参数,文件名称
String filename = request.getParameter("filename");
//加载使用字节输入流加载文件进内存 //2.1 找到文件服务器路径
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/img/" + filename); //2.2用字节流关联 地址传入之后 把文件读入内存 然后用fis就可写出到response输出流
FileInputStream fis = new FileInputStream(realPath); //设置response的响应头(类型conten-type 打开方式conten-disposition)
//因为setHead需要知道文件的类型,但是文件类型不确认,所以
//我们需要用servletContext.getMineType来获取文件的类型,传入
String mimeType = servletContext.getMimeType(filename);
response.setHeader("content-type",mimeType);
response.setHeader("content-disposition","attachment;filname"+filename); //将输入流的数据写出到输出流中
ServletOutputStream sos = response.getOutputStream();
byte[] buff = new byte[1024*8];//写了一个数据缓冲区
int len = 0; //输出流不用关 输入流建议关掉
while ((len = fis.read(buff)) != -1){
sos.write(buff,0,len);
}
fis.close(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}

downloadServlet

  • 遇到的问题:

1、如果文件名是中文,就会在下载页面那里,下载的filename不是中文

  • 解决:根据不同浏览器版本设置,设置filename的编码方式不同

360:url编码 火狐:base64编码
使用downloadUtils

 1 package cn.itcast.web.utils;
2
3 import sun.misc.BASE64Encoder;
4 import java.io.UnsupportedEncodingException;
5 import java.net.URLEncoder;
6
7
8 public class DownLoadUtils {
9
10 public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
11 if (agent.contains("MSIE")) {
12 // IE浏览器
13 filename = URLEncoder.encode(filename, "utf-8");
14 filename = filename.replace("+", " ");
15 } else if (agent.contains("Firefox")) {
16 // 火狐浏览器
17 BASE64Encoder base64Encoder = new BASE64Encoder();
18 filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
19 } else {
20 // 其它浏览器
21 filename = URLEncoder.encode(filename, "utf-8");
22 }
23 return filename;
24 }
25 }

DownloadUtils

 //补充:编码格式的问题 中文文件名
// 1.获取user-agent请求头
String agent = request.getHeader("user-agent");
// 2.使用工具类
filename = DownLoadUtils.getFileName(agent,filename);
												

java_web案例文件下载案例的更多相关文章

  1. Java 之 Response 文件下载案例

    文件下载需求: 1. 页面显示超链接 2. 点击超链接后弹出下载提示框 3. 完成图片文件下载 分析过程: 1. 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框 ...

  2. request和response文件下载案例

    一.需求分析 * 文件下载需求: 1. 页面显示超链接 2. 点击超链接后弹出下载提示框 3. 完成图片文件下载 * 分析: 1. 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析 ...

  3. VR定制 AR定制 就找北京动软VR开发团队(VR案例 AR案例)

    我们长期承接丰交互软件.游戏项目外包: VR/AR内容应用定制.VR.AR游戏项目外包(有主流测试硬件设备) VR全景应用.视频外包 请提供贵公司的信息,我们将提供高大上的VR案例欢迎联系我们给您提供 ...

  4. Hive学习之四 《Hive分区表场景案例应用案例,企业日志加载》 详解

    文件的加载,只需要三步就够了,废话不多说,来直接的吧. 一.建表 话不多说,直接开始. 建表,对于日志文件来说,最后有分区,在此案例中,对年月日和小时进行了分区. 建表tracktest_log,分隔 ...

  5. mysql 案例 ~ 常见案例汇总

    一 简介:这里汇总了一些mysql常见的问题二 案例场景   问题1 mysql设置了默认慢日志记录1S,为何会记录不超过1S的sql语句   答案 mysql~log_queries_not_usi ...

  6. 跟着百度学PHP[15]-SESSION的应用/网站登陆案例完整案例

    先把几个应该要有的页面建立好.

  7. 跟着百度学PHP[14]-COOKIE的应用/网站登陆案例完整案例

    先在数据库当中创建以下数据: mysql> create table user( -> id int not null auto_increment, ) not null default ...

  8. 键盘接收用户输入案例2(案例内容包含键盘接收 int、String、Char、double、boolean)等类型及介绍

    int类型: int age = input.nextInt();    double类型: double score = input.nextDouble(); String类型: String n ...

  9. swagger案例Swagger案例

    pom <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework ...

  10. 阶段3 2.Spring_07.银行转账案例_2 案例中添加转账方法并演示事务问题

    使用xmlioc这个项目进行完善. 创建一个新的工程把之前的代码都复制过来. 复制pom.xml内的依赖项 java下的com包复制过来. 配置文件复制过来 测试类固执过来 内容进行删减 测试类的方法 ...

随机推荐

  1. ES6高级编程(一)

    一.JavaScript概要 1.1.JavaScript组成 JavaScript主要由三部分构成,分别是ECMAScript.DOM与BOM ECMAScript定义了该语言的语法.类型.语句.关 ...

  2. Jenkinsfile Pipeline 使用 SSH 连接

    前提 首先你需要将用到的 SSH 私钥保存到 Jenkins 的凭据中,这样你会获得一个 credentialId.这不是本文主要的内容,故不在此展开赘述,详情可参考官方文档:https://www. ...

  3. ANSYS安装教程

    ANSYS 16.0 WIN10 64位安装步骤:1.使用"百度网盘客户端"下载ANSYS 16.0软件安装包到电脑磁盘里全英文名称文件夹内,安装前先断开网络,然后找到ANSYS. ...

  4. 森林野火故事2.0:一眼看穿!使用 Panel 和 hvPlot 可视化 ⛵

    作者:韩信子@ShowMeAI 数据分析实战系列:https://www.showmeai.tech/tutorials/40 本文地址:https://www.showmeai.tech/artic ...

  5. Linux配置篇 - Vmware网络配置

    网络配置 VM 网络详解 vmware提供了三种网络工作模式,Bridged(桥接模式).NAT(网络地址转换模式).Host-Only(仅主机模式): vmware网络配置步骤:编辑 -> 虚 ...

  6. MongoDB - 事务支持

    事务简介 事务是数据库中处理的逻辑单元,每个事务中包括一个或多个数据库操作,既可以是读操作,也可以是写操作. ACID 是一个"真正"事务所需要具备的一组属性集合,指的是原子性(A ...

  7. Spring Security(8)

    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 之前虽然实现了角色和权限之间的简单配对,但是如果每一个角色都要重新来过一次,就有点呆板了.如果能够配置一个「角色模板」,再通过这个模板来配置其他 ...

  8. 【每日一题】【回溯backtrace】N皇后

    n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案. 每一种解法包含一个不同的 n 皇后问 ...

  9. K8S 核心组件 kubelet 与 kube-proxy 分析

    kubelet kubelet 进程用于处理master 下发的任务, 管理pod 中的容器, 注册 自身所在的节点. 节点管理 启动参数说明 --register-node #如果设置为true 则 ...

  10. .NET 6 基于IDistributedCache实现Redis与MemoryCache的缓存帮助类

    本文通过IDistributedCache的接口方法,实现Redis与MemoryCache统一帮助类.只需要在配置文件中简单的配置一下,就可以实现Redis与MemoryCache的切换. 目录 I ...