浏览器向客户端提供文件下载(Java实现)

news/2024/7/8 2:46:39 标签: java, 开发语言, 后端

场景:
某一系统需上传黑白名单时,需向用户提供导入模板,这时候需要为客户端提供文件模板下载,用户按照该模板格式填写内容。

java">package com.wyw.learn.upOrdownload.service;

import lombok.RequiredArgsConstructor;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.InputStream;
import java.net.URLEncoder;

/**
 * @author name:    silk
 * @version 1.0
 * @description: TODO
 * @date 2024/7/4 20:38
 */
@Service
@RequiredArgsConstructor
public class TestServiceImpl {

    public void download(HttpServletRequest request, HttpServletResponse response) {
        try {
            // 这个zip文件要放在根目录地下的template文件夹下
            String path = "template/黑/白名单导入模板.zip";
            ClassPathResource resource = new ClassPathResource(path);
            // 读取到流中
            try (InputStream inputStream = resource.getInputStream()){
                String filename = new File(path).getName();
                // 重置响应对象。比如:清空缓冲区、重置响应头、重置响应状态码、取消响应内容的提交
                response.reset();
                // 告诉浏览器或其他客户端程序不要解析响应的内容,而是将其作为二进制数据下载到本地。如果是 application/octet-stream,浏览器会提示用户下载文件,而不是尝试在浏览器中打开它
                // Content-Disposition 告诉浏览器以附件形式下载文件,并指定下载时使用的文件名。这样,浏览器会提示用户下载 filename 文件,而不是在浏览器中打开它
                response.setContentType("application/octet-stream");
                response.addHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));
                ServletOutputStream outputStream = response.getOutputStream();
                byte[] b = new byte[1024];
                int len;
                // 从输入流中读取一定量的字节,并将其存储在缓冲区字节数组中,读到末尾返回-1
                while ((len = inputStream.read(b)) > 0) {
                    outputStream.write(b, 0 ,len);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


http://www.niftyadmin.cn/n/5536060.html

相关文章

Windows 下用MSYS2 环境为RP2040 编译MicroPython 固件

就是想试试看MSYS2 能兼容到什么地步。自己做了个RP2040 板子,用了4MB 的Flash,默认的Micropython 固件是2MB 的,所以只能自己编译固件。 编译环境 MSYS2 的安装方法、基本配置什么的我就不管了,到处都有文章介绍这个。只提一点…

品牌营销:白加黑经典案例分析,社交电商代运营公司,新零售全案策划

#白加黑营销 #品牌策划 #独特销售主张 #市场占领 品牌的核心目标是盈利,而品牌策划就是为了推动这一目标的实现,使整个过程更加顺利和成功。每一位企业家创建品牌的最终目的都是为了获取更多的利润。然而,理想与现实往往存在差距。在实际操作…

深度学习-数学基础(四)

深度学习数学基础 数学基础线性代数-标量和向量线性代数-向量运算向量加和向量内积向量夹角余弦值 线性代数-矩阵矩阵加法矩阵乘法矩阵点乘矩阵计算的其他内容 人工智能-矩阵的操作矩阵转置(transpose)矩阵与向量的转化 线性代数-张量(tensor…

Pip的缓存机制解析:提升Python包管理效率的秘密武器

Pip的缓存机制解析:提升Python包管理效率的秘密武器 Pip是Python的包管理工具,用于安装和管理Python库。从pip 20.3版本开始,引入了一项重要的特性——缓存机制。这一机制显著提升了包安装的速度和效率,尤其是在网络条件不佳或需…

技术赋能政务服务:VR导视与AI客服在政务大厅的创新应用

在数字化转型的浪潮中,政务大厅作为服务民众的前沿阵地,其服务效率和质量直接影响着政府形象和民众满意度。然而,许多政务大厅仍面临着缺乏智能化导航系统的挑战,这不仅增加了群众的办事难度,也降低了服务效率。维小帮…

NPM(Node Package Manager)常用指令详解

NPM(Node Package Manager)是Node.js的包管理工具,它允许用户从NPM仓库中安装、更新、删除软件包,以及管理项目的依赖关系。以下是NPM的一些常用命令及其详解: 查看版本 npm -v:查看当前NPM的版本号。 初始…

Dubbo 3.x源码(22)—Dubbo服务引用源码(5)服务引用bean的获取以及懒加载原理

基于Dubbo 3.1,详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了Dubbo3.1版本的服务引入的总体流程,当然真正的服务远程引入、以及配置迁移啥的都还没讲,但是本次我们先不接着讲MigrationRuleListener#onRefer方法,而是先…

OpenCV 张正友标定法(二)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 在之前的博客OpenCV 张氏标定法中,我们没有考虑镜头畸变等因素,因此计算出的内参与外参均是理想情况下的数值,而如果我们考虑到镜头的畸变: 我们就需要考虑使用最小二乘法最小化像素坐标的重投影误差(上述所求…