java_web案例文件下载案例
- 目的:完成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案例文件下载案例的更多相关文章
- Java 之 Response 文件下载案例
文件下载需求: 1. 页面显示超链接 2. 点击超链接后弹出下载提示框 3. 完成图片文件下载 分析过程: 1. 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框 ...
- request和response文件下载案例
一.需求分析 * 文件下载需求: 1. 页面显示超链接 2. 点击超链接后弹出下载提示框 3. 完成图片文件下载 * 分析: 1. 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析 ...
- VR定制 AR定制 就找北京动软VR开发团队(VR案例 AR案例)
我们长期承接丰交互软件.游戏项目外包: VR/AR内容应用定制.VR.AR游戏项目外包(有主流测试硬件设备) VR全景应用.视频外包 请提供贵公司的信息,我们将提供高大上的VR案例欢迎联系我们给您提供 ...
- Hive学习之四 《Hive分区表场景案例应用案例,企业日志加载》 详解
文件的加载,只需要三步就够了,废话不多说,来直接的吧. 一.建表 话不多说,直接开始. 建表,对于日志文件来说,最后有分区,在此案例中,对年月日和小时进行了分区. 建表tracktest_log,分隔 ...
- mysql 案例 ~ 常见案例汇总
一 简介:这里汇总了一些mysql常见的问题二 案例场景 问题1 mysql设置了默认慢日志记录1S,为何会记录不超过1S的sql语句 答案 mysql~log_queries_not_usi ...
- 跟着百度学PHP[15]-SESSION的应用/网站登陆案例完整案例
先把几个应该要有的页面建立好.
- 跟着百度学PHP[14]-COOKIE的应用/网站登陆案例完整案例
先在数据库当中创建以下数据: mysql> create table user( -> id int not null auto_increment, ) not null default ...
- 键盘接收用户输入案例2(案例内容包含键盘接收 int、String、Char、double、boolean)等类型及介绍
int类型: int age = input.nextInt(); double类型: double score = input.nextDouble(); String类型: String n ...
- swagger案例Swagger案例
pom <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework ...
- 阶段3 2.Spring_07.银行转账案例_2 案例中添加转账方法并演示事务问题
使用xmlioc这个项目进行完善. 创建一个新的工程把之前的代码都复制过来. 复制pom.xml内的依赖项 java下的com包复制过来. 配置文件复制过来 测试类固执过来 内容进行删减 测试类的方法 ...
随机推荐
- ES6高级编程(一)
一.JavaScript概要 1.1.JavaScript组成 JavaScript主要由三部分构成,分别是ECMAScript.DOM与BOM ECMAScript定义了该语言的语法.类型.语句.关 ...
- Jenkinsfile Pipeline 使用 SSH 连接
前提 首先你需要将用到的 SSH 私钥保存到 Jenkins 的凭据中,这样你会获得一个 credentialId.这不是本文主要的内容,故不在此展开赘述,详情可参考官方文档:https://www. ...
- ANSYS安装教程
ANSYS 16.0 WIN10 64位安装步骤:1.使用"百度网盘客户端"下载ANSYS 16.0软件安装包到电脑磁盘里全英文名称文件夹内,安装前先断开网络,然后找到ANSYS. ...
- 森林野火故事2.0:一眼看穿!使用 Panel 和 hvPlot 可视化 ⛵
作者:韩信子@ShowMeAI 数据分析实战系列:https://www.showmeai.tech/tutorials/40 本文地址:https://www.showmeai.tech/artic ...
- Linux配置篇 - Vmware网络配置
网络配置 VM 网络详解 vmware提供了三种网络工作模式,Bridged(桥接模式).NAT(网络地址转换模式).Host-Only(仅主机模式): vmware网络配置步骤:编辑 -> 虚 ...
- MongoDB - 事务支持
事务简介 事务是数据库中处理的逻辑单元,每个事务中包括一个或多个数据库操作,既可以是读操作,也可以是写操作. ACID 是一个"真正"事务所需要具备的一组属性集合,指的是原子性(A ...
- Spring Security(8)
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 之前虽然实现了角色和权限之间的简单配对,但是如果每一个角色都要重新来过一次,就有点呆板了.如果能够配置一个「角色模板」,再通过这个模板来配置其他 ...
- 【每日一题】【回溯backtrace】N皇后
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案. 每一种解法包含一个不同的 n 皇后问 ...
- K8S 核心组件 kubelet 与 kube-proxy 分析
kubelet kubelet 进程用于处理master 下发的任务, 管理pod 中的容器, 注册 自身所在的节点. 节点管理 启动参数说明 --register-node #如果设置为true 则 ...
- .NET 6 基于IDistributedCache实现Redis与MemoryCache的缓存帮助类
本文通过IDistributedCache的接口方法,实现Redis与MemoryCache统一帮助类.只需要在配置文件中简单的配置一下,就可以实现Redis与MemoryCache的切换. 目录 I ...
