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包复制过来. 配置文件复制过来 测试类固执过来 内容进行删减 测试类的方法 ...
随机推荐
- 基于SpERT的中文关系抽取
SpERT_chinese 基于论文SpERT: "Span-based Entity and Relation Transformer"的中文关系抽取,同时抽取实体.实体类别和关 ...
- Crypto - Caesar I
原题链接:http://www.wechall.net/challenge/training/crypto/caesar/index.php 告诉我们这是个古凯撒密码,让我们解...我们百度下古凯撒密 ...
- (GCC) gcc 编译选项 -fno-omit-frame-pointer,-fno-tree-vectorize,fno-optimize-sibling-calls;及内存泄漏、非法访问检测 ASAN
omit-frame-pointer 开启该选项,主要是用于去掉所有函数SFP(Stack Frame Pointer)的,即在函数调用时不保存栈帧指针SFP,代价是不能通过backtrace进行调试 ...
- 万字 HashMap 详解,基础(优雅)永不过时
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 前言 大家好,我是小彭. 在上一篇文章里,我们聊到了散列表的整体设计思想,在后续几篇文章里,我们将以 Jav ...
- 关于Qt的QPixmap中不支持jpg文件格式的问题
问题 Qt部分版本存在不支持jpg,JPEG等图像格式的问题 qDebug()<<QImageWriter::supportedImageFormats(); 这行代码可以查看所支持的图像 ...
- 推荐一款采用 .NET 编写的 反编译到源码工具 Reko
今天给大家介绍的是一款名叫Reko的开源反编译工具,该工具采用C#开发,广大研究人员可利用Reko来对机器码进行反编译处理.我们知道.NET 7 有了NativeAOT 的支持,采用NativeAOT ...
- 简单的Dos命令学习
Dos命令学习 打开CMD的方式 从菜单栏打开,windows系统里 win+R 输入cmd 在任意文件夹下,按住shift+右键,点击打开PowerShell 在资源管理器的地址栏前面加上cmd+空 ...
- 一定要用Photoshop?no!动手用Python做一个颜色提取器! ⛵
作者:韩信子@ShowMeAI Python3◉技能提升系列:https://www.showmeai.tech/tutorials/56 计算机视觉实战系列:https://www.showmeai ...
- JavaScript入门⑧-事件总结大全
JavaScript入门系列目录 JavaScript入门①-基础知识筑基 JavaScript入门②-函数(1)基础{浅出} JavaScript入门③-函数(2)原理{深入}执行上下文 JavaS ...
- 在微信上搭建ChatGpt机器人
在微信上搭建ChatGpt机器人 项目地址:https://gitee.com/shtml/wechatbot?_from=gitee_search 准备 一个服务器:Windos,Centos,Ub ...