分享一个简单的文件下载器

抽空写了一个用于下载文件的控制器类,只需要把文件的路径通过参数name传递到后台即可完成文件下载到本地,非常方便~

控制器类代码

package cn.edu.sgu.www.download.controller;import cn.edu.sgu.www.download.entity.RequestURI;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;/*** @author heyunlin* @version 1.0*/
@RestController
@RequestMapping(produces = "application/json;charset=utf-8")
public class DownLoadController {/*** 下载单张图片* 接口请求路径:localhost:8083/download?name=文件路径*/@RequestMapping(value = "/download", method = RequestMethod.GET)public void download(HttpServletRequest request, HttpServletResponse response)  {StringBuilder sb = new StringBuilder();ServletOutputStream outputStream = null;InputStream inputStream = null;try {String name = request.getParameter("name");RequestURI requestURI = parse(name);String fileName = requestURI.getName();sb.append(requestURI.getPath()).append(fileName);URL url = new URL(requestURI.getProtocol(), requestURI.getHost(), sb.toString());// 设置响应头response.setContentType("application/octet-stream");response.setHeader("Content-Disposition", "attachment;filename=" + fileName);outputStream = response.getOutputStream();inputStream = url.openConnection().getInputStream();byte[] buffer = new byte[1024];int len;while ((len = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, len);}outputStream.flush();} catch (IOException e) {e.printStackTrace();} finally {try {if(inputStream != null) {inputStream.close();}if(outputStream != null) {outputStream.close();}} catch (IOException e) {e.printStackTrace();}}}/*** 解析URL* @param name 文件url* @return RequestURI*/private RequestURI parse(String name) {int index = name.indexOf("//"); // 第一个//的位置int firstIndex; // 第1个/的位置String host; // 主机String path = ""; // 文件路径String protocol; // 协议// 没有指定协议,默认为httpif (index < 0) {firstIndex = name.indexOf("/"); // 第1个/的位置host = name.substring(0, firstIndex);protocol = "http";} else {firstIndex = name.indexOf("/", index + 2); // 第1个/的位置host = name.substring(index + 2, firstIndex);protocol = name.substring(0, index -1);}// 得到最后一个/的位置int lastIndex = name.lastIndexOf("/");if (firstIndex != lastIndex) {path = name.substring(firstIndex, lastIndex + 1);}String filename = name.substring(lastIndex + 1);System.out.println("协议 ==> " + protocol);System.out.println("服务器 ==> " + host);System.out.println("文件路径 ==> " + path);System.out.println("文件名 ==> " + filename);RequestURI requestURI = new RequestURI();requestURI.setProtocol(protocol);requestURI.setHost(host);requestURI.setPath(path);requestURI.setName(filename);return requestURI;}}

实体类代码

package cn.edu.sgu.www.download.entity;import lombok.Data;/*** @author heyunlin* @version 1.0*/
@Data
public class RequestURI {/*** 协议*/private String protocol;/*** 主机域名*/private String host;/*** 文件路径*/private String path;/*** 文件名*/private String name;
}

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

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

相关文章

Kotlin 中,扩展函数(Extension Functions)

在 Kotlin 中&#xff0c;扩展函数&#xff08;Extension Functions&#xff09;是用于向已有的类添加新功能而无需继承或使用装饰模式的一个特性。这允许你通过更自然的语法为现有类型添加方法。 下面是一个简单的扩展函数示例&#xff1a; // 定义一个扩展函数&#xff0c;…

SAP ABAP 三种汇总方法

1.select sum 汇总 select key1 key2 sum ( case zhiduanwhen 1 then suliang1when 2 then suliang2end ) as cnt from table where satue in (1,2) order by key1 key2 "必有 group by key1 key2 "必有2.loop 汇总 在loo…

kettle从入门到精通 第六十四课 ETL之kettle kettle中执行SQL脚本步骤,使用需当心

1、群里有不定时会有同学反馈执行SQL脚本步骤使用有问题&#xff0c;那么咱们今天一起来学习下该步骤。trans中的执行SQL脚本有两方面功能&#xff0c;使用时需小心&#xff0c;不然很容易踩坑。 官方定义&#xff1a; 翻译&#xff1a; 您可以使用此步骤执行 SQL 脚本&#…

安装TTS被卡住不下载应该怎么操作

安装 TTS 模块时&#xff0c;如果发现下载的依赖项数量很多&#xff0c;安装时间过长&#xff0c;并且卡在某些地方&#xff0c;可以尝试以下方法&#xff1a; 1. 确认依赖项的下载是否完成 在安装过程中&#xff0c;检查是否有依赖项已经下载并安装成功。在大多数情况下&…

回溯法——跳房子

跳房子是小朋友玩的游戏。地面上画出一连串格子&#xff0c;每个格子里有一个整数&#xff0c;小朋友从外面跳入格子&#xff0c;并继续往前跳&#xff0c;直到跳出所有格子。每次跳跃的规则是&#xff0c;可以跳入下一格或下下格或下下下格。怎么跳能让落脚格子里的数的累加和…

数据库管理-第198期 升级Oracle ACE Pro,新赛季继续努力(20240605)

数据库管理198期 2024-06-05 数据库管理-第198期 升级ACE Pro&#xff0c;新赛季继续努力&#xff08;20240605&#xff09;1 惊喜2 变化3 Oracle ACE总结 数据库管理-第198期 升级ACE Pro&#xff0c;新赛季继续努力&#xff08;20240605&#xff09; 作者&#xff1a;胖头鱼的…

区间预测 | Matlab实现QRBiTCN分位数回归双向时间卷积神经网络注意力机制时序区间预测

Matlab实现QRBiTCN分位数回归双向时间卷积神经网络注意力机制时序区间预测 目录 Matlab实现QRBiTCN分位数回归双向时间卷积神经网络注意力机制时序区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现QRBiTCN分位数回归双向时间卷积神经网络注意力机制时序…

实现 Python 服务在执行完毕后主动向前端发送信息,以便前端(例如 Vue.js 应用)可以更新显示

可以通过多种方法实现 Python 服务在执行完毕后主动向前端发送信息&#xff0c;以便前端&#xff08;例如 Vue.js 应用&#xff09;可以更新显示。下面介绍几种常见的方法&#xff1a; 1. 使用 WebSockets WebSockets 是一种在客户端和服务器之间建立持久连接的通信协议&…

在网页中调用MSTSC打开远程桌面

1.修改注册表 添加自定义URL协议 MSTSC [HKEY_CLASSES_ROOT\MSTSC]"URL:MSTSCProtocol""URL Protocol"""[HKEY_CLASSES_ROOT\MSTSC\DefaultIcon] "mstsc.exe"[HKEY_CLASSES_ROOT\MSTSC\shell][HKEY_CLASSES_ROOT\MSTSC\shell\open][…

C++ STL std::vector的实现机制【面试】

std::vector 是 C 标准模板库&#xff08;STL&#xff09;中的一种序列容器&#xff0c;它封装了动态数组的实现&#xff0c;提供了一系列方法来操作这个动态数组。以下是 std::vector 的一些关键实现机制&#xff1a; 连续内存存储&#xff1a; std::vector 通过一块连续的内存…

51单片机在八位数码管上显示自己学号后八位

1、功能描述 在八位数码管上显示自己学号后八位 2、实验原理 数码管就是通过线路将各个LED灯连接在一起。 P2控制LED的段选&#xff0c; P0控制LED位选。读取时从低位向高位读取&#xff0c;P2_2为高位P2_4为地位&#xff0c;例如P2_4 1; P2_3 0; P2_2 1&#xff0c;那么…

LabVIEW飞机发动机测试与故障诊断系统

LabVIEW飞机发动机测试与故障诊断系统 基于LabVIEW开发了一个飞机发动机测试与故障诊断系统&#xff0c;能够实时监测发动机的运行参数&#xff0c;进行数据采集与分析&#xff0c;并提供故障诊断功能。系统采用高精度传感器和数据采集硬件&#xff0c;适用于发动机的性能测试、…

C++ | Leetcode C++题解之第136题只出现一次的数字

题目&#xff1a; 题解&#xff1a; class Solution { public:int singleNumber(vector<int>& nums) {int ret 0;for (auto e: nums) ret ^ e;return ret;} };

MPU6050篇——温度与角度的读取

一、MPU6050的读写时序 1. MPU6050写时序 1. 首先是IIC的起始信号&#xff0c;也就是&#xff1a; MPU_IIC_Start(); 2. 然后接下来便是发送器件地址以及写命令&#xff1a;其中MPU6050的地址为7位&#xff0c;而八位为一个数据帧&#xff0c;所以在最后一位再加一位是指定…

用户管理的小demo--过滤器filter

1、创建 CharEncodingFilter.java package com.by.filter; import javax.servlet.*; import java.io.IOException; public class CharEncodingFilter implements Filter {Overridepublic void init(FilterConfig filterConfig) throws ServletException {}Overridepublic void …

C++ | Leetcode C++题解之第135题分发糖果

题目&#xff1a; 题解&#xff1a; class Solution { public:int candy(vector<int>& ratings) {int n ratings.size();int ret 1;int inc 1, dec 0, pre 1;for (int i 1; i < n; i) {if (ratings[i] > ratings[i - 1]) {dec 0;pre ratings[i] rati…

python基于flask写后端接口、python接收请求、python作为服务端提供接口、python接收json数据或数组

文章目录 一、Flask 构成二、基于flask写后端接口2.1、接口可以调用其他类成员示例2.2、接口的入参是多个的示例2.3、接口的入参是路径的示例2.4、接口的入参是数组的示例2.5、python接收json数据或数组2.5.1、接口的入参是list的示例,入参是json格式2.5.2、接收json数据2.5.3、…

116页 | 2024年中国金融行业网络安全研究报告(免费下载)

以上是资料简介和目录&#xff0c;如需下载&#xff0c;请前往星球获取&#xff01;&#xff01;&#xff01;

Linux - 深入理解/proc虚拟文件系统:从基础到高级

文章目录 Linux /proc虚拟文件系统/proc/self使用 /proc/self 的优势/proc/self 的使用案例案例1&#xff1a;获取当前进程的状态信息案例2&#xff1a;获取当前进程的命令行参数案例3&#xff1a;获取当前进程的内存映射案例4&#xff1a;获取当前进程的文件描述符 /proc中进程…

29、matlab算数运算汇总2:加、减、乘、除、幂、四舍五入

1、乘法:times, .* 语法 C A.*B 通过将对应的元素相乘来将数组 A 和 B 相乘。 C times(A,B) 是执行 A.*B 的替代方法&#xff0c; 1)将两个向量相乘 代码及运算 A [1 0 3]; B [2 3 7]; C A.*BC 2 0 212&#xff09; 将两个数组相乘 代码及运算 A [1 0 3;…