• 目的:完成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. SpringBoot怎么自定义一个Starter ?

    小伙伴们曾经可能都经历过整天写着CURD的业务,都没写过一些组件相关的东西,这篇文章记录一下SpringBoot如何自定义一个Starter. 原理和理论就不用多说了,可以在网上找到很多关于该方面的资 ...

  2. Django 接收到body后 json.loads() 报编码错误 且在报错之前打印body为空

    python版本 3.7.5 Django版本 3.2.5 猜测可能是Django版本的问题,因为之前并没有出现过如此奇葩的问题. body = request.body.decode('utf-8' ...

  3. 绵阳2020CCPC补题

    绵阳2020CCPC D,K,J,L,G D. Defuse the Bombs 知识点:二分答案 复杂度:\(O(nlogn+log^2n)\) vp时我猜了一个结论,验了几个样例就写了,喜提WA3 ...

  4. <一>关于运算符重载

    C++的运算符重载:使对象的运算表现得和编译器内置类型一样 如下代码,如果T是整形,那很好理解,但是如果 T 是一个 Student 类, a + b ?怎么操作,两个学生类怎么相加? 这个就是我们要 ...

  5. Python基础之数据库:2、MySQL的下载与安装、基本使用、系统服务制作

    目录 一.MySQL简介 二.安装与下载 1.下载流程 2.配置环境变量 三.主要目录介绍 四.基本使用 五.系统服务的制作 六.密码相关 1.修改管理员密码 2.忘记密码 一.MySQL简介 ​ M ...

  6. NavBarControl 通过代码添加

    看到网上很多都是直接在控件上面添加的 而我的是保存在数据库读取后添加的. 后来自己摸索了一下. 通过代码添加 navBarControl1.Groups.Add(new NavBarGroup( st ...

  7. Blazor Server完美实现Cookie Authorization and Authentication

    Blazor server-side application用Microsoft.AspNetCore.Identity.EntityFrameworkCore实现Authorization 和 Au ...

  8. Golang反射获得变量类型和值

    1. 什么是反射 反射是程序在运行期间获取变量的类型和值.或者执行变量的方法的能力. Golang反射包中有两对非常重要的函数和类型,两个函数分别是: reflect.TypeOf 能获取类型信息re ...

  9. 【Spark】Day02:Spark-Core:RDD概述、RDD编程(转换算子、Action)、序列化、依赖关系、持久化、数据读取保存、累加器、广播变量、top10、转化率

    总结:https://www.cnblogs.com/qingyunzong/p/8899715.html 一.RDD概述 1.引入:IO流 按行.按字节.字节缓冲 调用read方法读取流,均为惰性加 ...

  10. SpringBoot 自动装配的原理分析

    关于 SpringBoot 的自动装配功能,相信是每一个 Java 程序员天天都会用到的一个功能,但是它究竟是如何实现的呢?今天阿粉来带大家看一下. 自动装配案例 首先我们通过一个案例来看一下自动装配 ...