后端主流框架-SpringMvc-day2

news2024/11/16 23:40:57

Java中的文件下载

2 文件下载

文件下载:就是将服务器(表现在浏览器中)中的资源下载(复制)到本地磁盘;

2.1 前台代码
  1. 前台使用超链接,超链接转到后台控制器,在控制器通过流的方式进行操作;

在这里插入图片描述

2.2 后台代码
@Controller
public class DownloadController {
	@RequestMapping("/download")
	public void download(String filename,HttpServletRequest req,HttpServletResponse resp) throws Exception{
		//1.获取输入流
		//1.1.获取文件在服务器的绝对路径
		String parentPath = req.getServletContext().getRealPath("/download");
		File file = new File(parentPath, filename);
		if(file.exists()){
			FileInputStream in = new FileInputStream(file);

			//2.获取输出流
			//2.1.设置文件下载的名字  -- 附件表示做下载或上传操作,浏览器就不会将文件的内容直接显示出来了
			resp.setHeader("Content-Disposition", "attachment; filename=" + filename);
			//2.2.获取输出流
			ServletOutputStream out = resp.getOutputStream();

			//3.实现下载
			IOUtils.copy(in, out);
			//关流,释放资源
			out.close();
			in.close();
		}
	}
}
2.3 解决中文问题

问题描述:当下载 “美女.rar”,问题就出现了?
在这里插入图片描述

解决方法:兼容IE、edge和其他浏览器

分析: 如果是IE或edge就用URLEncoder,如果是其他浏览器就要用以下方式解决:

new String(name.getBytes(“UTF-8”),“ISO-8859-1”)

user–agent:这个请求头是指用户代理的意思,告诉服务器使什么浏览器;

@Controller
public class DownloadController {
	@RequestMapping("/download")
	public void download(String filename,HttpServletRequest req,HttpServletResponse resp) throws Exception{
		//1.获取输入流
		//1.1.获取文件在服务器的绝对路径
		String parentPath = req.getServletContext().getRealPath("/download");
		File file = new File(parentPath, filename);
		if(file.exists()){
			FileInputStream in = new FileInputStream(file);
			//2.获取输出流
			//2.1.中文文件名称处理(ie和edge都是微软的浏览器 -- 处理方式一样)
//区分浏览器,User-Agent中有浏览器的信息,trident是ie引擎名称,具体:
//mozilla/5.0 (windows nt 6.2; win64; x64; trident/7.0; rv:11.0) like gecko【eclipse自带ie浏览器】
//Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) 
		    //Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763【电脑安装的edge浏览器】
//mozilla/5.0 (windows nt 10.0; win64; x64; rv:68.0) gecko/20100101 firefox/68.0【火狐】
//mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/73.0.3683.86 safari/537.36【谷歌】
			//ie浏览器
			if(req.getHeader("User-Agent").toUpperCase().indexOf("TRIDENT")!=-1){
				filename = URLEncoder.encode(filename, "utf-8");
				//电脑自带edge【edʒ】浏览器	
			}else if(req.getHeader("User-Agent").toUpperCase().indexOf("EDGE")!=-1){		
				filename = URLEncoder.encode(filename, "utf-8");
			}else{//其他浏览器
				filename = new String(filename.getBytes("UTF-8"),"ISO-8859-1");//转码的方式
			};

			//2.2.设置文件下载的名字  -- 附件表示做下载或上传操作,浏览器就不会将文件的内容直接显示出来了
			resp.setHeader("Content-Disposition", "attachment; filename=" + filename);
			//2.3.获取输出流
			ServletOutputStream out = resp.getOutputStream();
			//3.实现下载
			IOUtils.copy(in, out);
			//关流,释放资源
			out.close();
			in.close();
		}
	}
}		
页面:
<a href='/download?fileName=<%=URLEncoder.encode("美女.jpg", "utf-8") %>'>美女.jpg</a>

注:Microsoft Edge和IE的最大区别就是Edge 是windows 10 之后有微软推出的浏览器,而在windows 10 之前微软系统自家浏览器都是IE;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1339052.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Intel FPGA 技术开放日

概要 时间&#xff1a;2023.11.14 全天 &#xff08; 9:00 - 16: 20&#xff09; 地点&#xff1a;北京望京. 凯悦酒店 主题内容&#xff1a;分享交流了Intel FPGA 产品技术优势和落地实践方案。 会议的议程 开场致词&#xff1a; FPGA业务&#xff0c;是几年前intel收购而…

虚拟环境和Pycharm中均有transforms仍报ModuleNotFoundError:No module named ‘transformers‘

问题&#xff1a;运行新模型&#xff0c;配置了新环境&#xff0c;下载了包后&#xff0c;仍然报ModuleNotFoundError&#xff1a;No module named transformers 错误。 查看Pycharm解释器&#xff1a; 没问题&#xff01;&#xff01;&#xff01;&#xff1f; 命令行查看虚…

Flink Job 执行流程

Flink On Yarn 模式 ​ 基于Yarn层面的架构类似 Spark on Yarn模式&#xff0c;都是由Client提交App到RM上面去运行&#xff0c;然后 RM分配第一个container去运行AM&#xff0c;然后由AM去负责资源的监督和管理。需要说明的是&#xff0c;Flink的Yarn模式更加类似Spark on Ya…

Hive安装笔记——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项——任务2:离线数据处理

将下发的ds_db01.sql数据库文件放置mysql中 12、编写Scala代码&#xff0c;使用Spark将MySQL的ds_db01库中表user_info的全量数据抽取到Hive的ods库中表user_info。字段名称、类型不变&#xff0c;同时添加静态分区&#xff0c;分区字段为etl_date&#xff0c;类型为String&am…

【电商项目实战】基于SpringBoot完成首页搭建

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《电商项目实战》。&#x1f3af;&#x1f3af; &am…

【PyQt学习篇 · ⑭】:QTableView的使用

文章目录 QTableView的使用示例 QTableView的使用 QTableView 是 PyQt 中用于显示表格数据的窗口部件&#xff0c;它提供了一个灵活的方式来显示和编辑数据。下面是一些关于 QTableView 的使用的具体信息&#xff1a; 创建 QTableView 对象&#xff1a; from PyQt5.QtWidgets …

计算机网络基础:OSI参考模型是什么?

一、概述 OSI (Open Systems Interconnection Model,开放式系统互联模型)&#xff0c;由ISO ( International Organization for Standardization&#xff0c;国际标准化组织 ) 收录在ISO 7489标准中并于1984年发布。 意义&#xff1a; 在OSI没有出来之前我们的网络有如下问题…

Linux Debian12使用podman安装upload-labs靶场环境

一、upload-labs简介 PHP语言编写&#xff0c;持续收集渗透测试和CTF中针对文件上传漏洞的靶场&#xff0c;总共21关&#xff0c;每一关都包含着不同的上传绕过方式。 二、安装podman环境 Linux Debian系统如果没有安装podman容器环境&#xff0c;可以参考这篇文章先安装pod…

如何在vscode当中预览html文件运行结果

如何在vscode当中预览html文件运行结果 下载拓展内容打开拓展界面下载拓展 运行html文件参考内容 上一篇文章当中讲了如何实现在网页上对html文件的预览,但是这样子其实在运行代码的过程当中效果比较差,那么还需要可以实时预览运行的结果 下载拓展内容 打开拓展界面 下载拓展 …

微信小程序发放红包封面及领取

微信小程序发放红包封面及领取 一、微信红包封面开放平台配置发放的红包封面二、小程序后管平台设置配置录入红包封面奖品信息三、微信小程序调用接口效果 一、微信红包封面开放平台配置发放的红包封面 微信红包封面开放平台 红包封面的发放方式有&#xff1a;领取二维码、领…

unity 保存和加载窗口布局

这么简单的事网上一堆废话文章 右上角&#xff0c;Layout点开后有保存和删除 要切换布局点红框里的已经保存的布局

Linux下MQTT环境的简单应用及搭建——之Mosquitto

文章目录 前言一、ubuntu搭建mqtt服务器 | 概要二、整体架构流程 | 技术实现细节1、下载源码2、安装Mosquitto3、解压并修改配置文件4、关于Mosquitto常见的一些操作指令5、启动mosquitto6、测试mosquitto测试1&#xff1a;Linux多终端交互测试测试2&#xff1a;Linux与Windows…

2023安洵杯-秦岭防御军wp

reverse 感觉有点点简单## import base64 def ba64_decode(str1_1):mapp "4KBbSzwWClkZ2gsr1qAQu0FtxOm6/iVcJHPY9GNp7EaRoDf8UvIjnL5MydTX3eh"data_1 [0] * 4flag_1 [0] * 3for i in range(32, 127):for y in range(32, 127):for k in range(32, 127):flag_1[0]…

MIT线性代数笔记-第30讲-奇异值分解

目录 30.奇异值分解打赏 30.奇异值分解 奇异值分解&#xff08;简称 S V D SVD SVD分解&#xff09;可以将一个比较复杂的矩阵用更小更简单的几个子矩阵相乘来表示&#xff0c;这些小矩阵描述的都是矩阵的重要的特性。奇异值分解在图形降噪、推荐系统中都有很重要的应用。 对…

最优化考试之牛顿法

最优化考试之牛顿法 一、牛顿法1.问题条件2.求解过程3.例子 PS 一、牛顿法 1.问题条件 目标函数 f ( x ) f(x) f(x)&#xff0c;求极小值初始点 x 0 x_0 x0​精度要求e&#xff08;没有提就是近似0&#xff09; 2.求解过程 求解一阶雅克比矩阵 ∇ f ( x ) ∇f(x) ∇f(x)和二…

分享11 种有用的 JavaScript 技巧

今天这篇文章&#xff0c;我想与你分享 11个有用的JavaScript实用小技巧&#xff0c;它们将极大地提高你的工作效率。 1.生成随机颜色的两种方式 1&#xff09;.生成RandomHexColor const generateRandomHexColor () > {return #${Math.floor(Math.random() * 0xffffff)…

Java多线程的概念以及三种实现方式(Thread类,Callable接口,Runnable接口)

目录 1.线程2.多线程的应用场景3.并发和并行4.多线程的实现方式1.继承Thread类的方式进行实现2.实现**Runnable接口**的方式进行实现3.利用Callable接口和Future接口方式实现 4.多线程几种实现方式之间的对比 1.线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程…

Jmeter之JSON断言

需求 我们发送一个请求&#xff0c;结果返回json数据&#xff0c;我们需要根据json数据中code的值来判断此次请求是否成功。 接口案例&#xff1a; PostMapping(value "/login") public ResponseMessage<String> login(RequestBody SeckillUserDTO seckill…

LeetCode-移除元素(27) 合并两个有序数组(88)

1.移除元素&#xff08;27&#xff09; 题目描述&#xff1a; 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入…

Session的使用详解(创建,获取和销毁)

文章目录 Session的使用详解&#xff08;创建&#xff0c;获取和销毁&#xff09;1、为什么使用session,与cookie的区别2、session是什么3、session的常用方法4、session的构造和获取代码演示SetSessionServlet.javaGetSessionServlet.javaweb.xml运行结果如下: 5、销毁session…