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包复制过来. 配置文件复制过来 测试类固执过来 内容进行删减 测试类的方法 ...
随机推荐
- Linux系统安装 tftp服务 NFS服务
安装tftp服务 安装 sudo apt-get install tftp-hpa tftpd-hpa 配置文件 # /etc/default/tftpd-hpa TFTP_USERNAME=&quo ...
- DLR 的扩展库 Dynamitey
.NET 在 CLR 对动态语言或者脚本语言的支持是通过DLR 完成的, Miguel de Icaza对 DLR 的特点概括如下: 一个针对动态语言的共享式类型系统: 一个共享的 AST,可以被语言 ...
- 批量删除多个相同格式内容的Excel表格的列
Sub Del_Col()Application.DisplayAlerts = FalseDim myFiles As StringDim myExcels As StringWith Applic ...
- Java内存马的学习总结
1.前置知识 Java Web三大组件 Servlet Servlet是运行在 Web 服务器或应用服务器上的程序,它是作为来自 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中 ...
- 【Shell案例】【取指定列的方式$5 p[6],双括号运算、awk、管道运算】8、统计所有进程占用内存大小的和
假设 nowcoder.txt 内容如下:root 2 0.0 0.0 0 0 ? S 9月25 0:00 [kthreadd]root 4 0.0 0.0 0 0 ? I< 9月25 0:00 ...
- MetaTown:一个可以自己构建数字资产的平台
摘要:华为云Solution as Code重磅推出<基于MetaTown构建数字资产平台>解决方案. 本文分享自华为云社区<基于MetaTown构建数字资产平台>,作者: 阿 ...
- 基于MATLAB的人民币识别系统
1.选图背景 随着科技的发展,图像识别技术在计算机视觉领域起着越来越重要的作用,现已被应用到金融.军事.公安刑侦.生物医学.机器视觉等各个领域: 随着国民经济的快速发展,人民币大量流通市场,商业交易都 ...
- 关系数据库——MySQL
数据库 1.基本操作 1.1命令行操作 mysql -u username -p+password; --连接数据库 flush privileges; --刷新权限 show databases; ...
- 【深入浅出 Yarn 架构与实现】4-4 RM 管理 Application
在 YARN 中,Application 是指应用程序,它可能启动多个运行实例,每个运行实例由 -个 ApplicationMaster 与一组该 ApplicationMaster 启动的任务组成, ...
- YMOI 2019.6.8
题解 YMOI 2019.6.8 前言 第二回考试,承让拿了第一次rank1,(●ˇ∀ˇ●) 题解 这次考试总体发挥比较好,每一道题都尽可能得取得了所能及的所有分.虽然多少还是有失误,不过在所难免.保 ...
