• 文件下载需求

    1.页面显示超链接

    2.点击超链接后弹出下载框

    3.完成图片文件下载
  • 分析

    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输出流
  • 问题
    • 中文文件问题

      • 解决思路

        1.获取客户端使用的浏览器版本信息

        2.根据不同的版本信息,设置filename的编码方式

代码如下

package cn.itcast.web.servletcontext;

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");
//使用字节输入流加载文件进内存
//找到文件服务器路径
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/img/" + filename);
//用字节流关联
FileInputStream fis = new FileInputStream(realPath);
//设置response的响应头
//设置响应头content-type
String mimeType = servletContext.getMimeType(filename);//获取文件的MIME类型
response.setHeader("content-type", mimeType);
//设置响应头打开方式content-disposition
response.setHeader("content-disposition", "attachment;filename" + filename);
//将输入流的1数据写到输出流中
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);
}
}
-------------------------------------------------------------------------------------
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="/07_Response_war_exploded/img/1.jpg">图片1</a>
<a href="/07_Response_war_exploded/DownloadServlet?filename=1.jpg">图片1</a>
<a href="/07_Response_war_exploded/img/二.jpg">图片2</a>
<a href="/07_Response_war_exploded/DownloadServlet?filename=二.jpg">图片2</a>
</body>
</html>

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

  1. JAVA文件下载功能问题解决日志

    今天给报告系统做了个下载功能,遇到了挺多问题,通过查资料一一解决了. 1.首先遇到的问题是:java后台的输出流输出之后,没有任何报错,浏览器端不弹出保存文件的对话框,原本是ajax请求到后台的con ...

  2. JAVA实用案例之水印开发

    写在最前面 上周零零碎碎花了一周的时间研究水印的开发,现在终于写了个入门级的Demo,做下笔记同时分享出来供大家参考. Demo是在我上次写的 JAVA实用案例之文件导入导出(POI方式) 框架基础上 ...

  3. JAVA实用案例之图片水印开发

    写在最前面 上周零零碎碎花了一周的时间研究水印的开发,现在终于写了个入门级的Demo,做下笔记同时分享出来供大家参考. Demo是在我上次写的 JAVA实用案例之文件导入导出(POI方式) 框架基础上 ...

  4. JAVA实用案例之文件导出(JasperReport踩坑实录)

    写在最前面 想想来新公司也快五个月了,恍惚一瞬间. 翻了翻博客,因为太忙,也有将近五个多月没认真总结过了. 正好趁着今天老婆出门团建的机会,记录下最近这段时间遇到的大坑-JasperReport. 六 ...

  5. 关于java文件下载文件名乱码问题解决方案

    JAVA文件下载时乱码有两种情况: 1,下载时中文文件名乱码 2,下载时因为路径中包含中文文件名乱码,提示找不到文件 解决方法见下面部分代码 response.setContentType(" ...

  6. Java 实验案例(多态)

    实验任务 任务一:图形面积周长计算小程序 任务二:饲养员喂养动物程序 实验内容: 任务一: 图形面积周长计算 任务目的: 掌握多态的含义及应用场合 掌握上转型对象和多态的实现 掌握abstract关键 ...

  7. Java小案例-(逃离迷宫)

    Java小案例-(逃离迷宫) 一,迷宫需求描述: 1,用户输入迷宫图(限制方形):字母1位墙,0为通,e为出口,m为入口,*为已访问的位置,用外围1围住迷宫 2,运行轨迹右,左,下,上 3,判断该迷宫 ...

  8. Java小案例(行星移动)

    Java小案例 行星移动:参考:三百集 使用软件:idea2017,java 1,图片集:这里  (idea图片源放在target目录下,才能访问到),建议从小往上看... 2,定义MyFrame p ...

  9. Java项目案例之--封装的实例

    Java项目案例之---封装的实例 有一个专业类,有一个专业对象,专业名称:计算机科学与技术,专业编号:J001,专业年限:4,对年限添加约束,如果输入小于0,则默认为0,否则显示输入的值 有一个学生 ...

  10. jwt 0.9.0(三)jwt客户端存储状态可行性分析,及Java代码案例

    Jwt客户端存储状态可行性分析 1.前端首次访问后台,后台生成token,放在http header的Authorization里(官网推荐,可解决跨域cookie跨域问题),并且Authorizat ...

随机推荐

  1. uniapp获取用户信息

    新接口getUserProfileFn内置login,如果必须要login返回的参数要隔离开 vue3书写要对按钮配置属性 <button @click="logintou" ...

  2. mysql,左连接 ,查询右表为null的写法,删除,带join条件的写法

    select * from sale_guest sg left join sale_bill sbon sg.bill_id=sb.id where sg.gmt_create>'2023-1 ...

  3. linux内核参数调优和Linux实例常用内核网络参数介绍与常见问题处理

    问题1 并发场景下,常常会出现一个进程最大文件句柄数不足的情况,会报如下错误: 24: Too many open files 解决办法 ulimit -a S:表示软限制,超出设定的值会告警. H ...

  4. [NOIP2000 提高组] 单词接龙

    传送锚点:https://www.luogu.com.cn/problem/P1019 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以 ...

  5. [NOIP2004 普及组] 火星人

    传送锚点:https://www.luogu.com.cn/problem/P1088 题目描述 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明 ...

  6. beego go mod 模式下无法生成注解路由的问题 解决方法

    执行 go get github.com/beego/bee 命令时将bee 命令一定要安装在gopath目录下.有idea或者goland编辑器是最方便的,只需要复制这条命令,然后进入编辑器会提示你 ...

  7. 行列式求值,从 $n!$ 优化到 $n^3$

    前置知识 \(\sum\) 为累加符号,\(\prod\) 为累乘符号. 上三角矩阵指只有对角线及其右上方有数值其余都是 \(0\) 的矩阵. 如果一个矩阵的对角线全部为 \(1\) 那么这个矩阵为单 ...

  8. manjaro安装错误的显卡驱动导致无法开机(解决办法)

    手欠的我 最近发觉我的manjaro有时候开机会卡死在clean ....这个地方,然后我去看了下系统的日至,发现是nvidia的一个报错,我也不太懂什么意思 然后我就自己动手想改改显卡驱动(从pri ...

  9. 开源一站式敏捷测试管理,极简项目管理平台 itest(爱测试) 6.6.2 发布,便捷迫切功能增强

    (一)itest 简介及更新说明 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理,接口测试5合1,又有丰富的统计分析.可按测试包分配测试用例执行 ...

  10. SHA256/SHA512码计算方式

    (1)Windows系统计算SHA256/SHA512码的方式: certutil -hashfile yourfilename SHA256/SHA512 以计算readme.txt文档进行说明: ...