首页 > 其他分享 >通用文件强制下载

通用文件强制下载

时间:2024-09-14 18:29:14浏览次数:11  
标签:outputStream 通用 url xhr new 强制 response 下载 const


通用文件强制下载

后端:

@ApiOperation(
        value = "通用文件下载",
        notes = "通用文件下载"
    )
    @GetMapping({"/view/{id}"})
    public void viewImage(HttpServletResponse response, @PathVariable String id) {
        if (Str.isNotEmpty(id)) {
            SysFile sysFile = (SysFile)this.sysFileService.getById(id);
            if (sysFile != null && Str.isNotEmpty(sysFile.getPath())) {
                String filePath = this.uploadPath + sysFile.getPath();
                this.outputImage(response, filePath, sysFile.getOriginalName());
            }
        }
 
    }
 
    private void outputImage(HttpServletResponse response, String filePath, String fileName) {
        InputStream inputStream = null;
        ServletOutputStream outputStream = null;
 
        try {
            File file = new File(filePath);
            response.setContentType("application/force-download");
            response.addHeader("Content-Disposition", "attachment;fileName=" + new String((Str.isNotEmpty(fileName) ? fileName : file.getName()).getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
            inputStream = new BufferedInputStream(new FileInputStream(filePath));
            outputStream = response.getOutputStream();
            byte[] buf = new byte[1024];
 
            int len;
            while((len = inputStream.read(buf)) > 0) {
                outputStream.write(buf, 0, len);
            }
 
            response.flushBuffer();
        } catch (IOException var21) {
            log.error("预览文件失败" + var21.getMessage());
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException var20) {
                    log.error(var20.getMessage(), var20);
                }
            }
 
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException var19) {
                    log.error(var19.getMessage(), var19);
                }
            }
 
        }
    }

前端:

/**
 * 下载文件
 * @param {*} url 
 */
export function XHRLoadFileTwo(url) {
  const token = getToken();
  let xhr = new XMLHttpRequest()
  if (url.charAt(0) !== "/") {
    url = "/" + url;
  }
 
  xhr.open('get', process.env.BASE_API + url)
  //如果需要请求头中这是token信息可以在这设置
  xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8')
  xhr.setRequestHeader('X-Access-Token', token)
  xhr.responseType = 'blob'
  xhr.send();
  // 此处引入了mock需要这样写,mock改写了XMLHttpRequest
  if (window._XMLHttpRequest) {
    XHRLoadFileTwo_1(xhr)
  } else {
    xhr.onreadystatechange = function () {
      XHRLoadFileTwo_1(xhr)
    }
  }
}
 
export function XHRLoadFileTwo_1(xhr) {
  if (xhr.readyState === 4 && xhr.status === 200) {
    const blob = xhr.response;
    const filename = getFilename(xhr.getResponseHeader('content-disposition'));
    
    // 创建一个a标签元素,设置下载属性,点击下载,最后移除该元素
    const link = document.createElement('a');
    link.href = window.URL.createObjectURL(blob);
    link.download = filename;
    
    // 下载
    link.click();
    
    // 移除a标签元素
    document.body.removeChild(link);
  }
}
 
export function getFilename(header) {
  const match = header.match(/fileName=(.*?)(;|$)/);
  if (match && match.length > 1) {
    return match[1];
  } else {
    return 'download';
  }
}


标签:outputStream,通用,url,xhr,new,强制,response,下载,const
From: https://blog.51cto.com/u_15903793/12018146

相关文章

  • 【Ehviewer绿色版】1.9.8.4最新版本下载2024安卓苹果
     Ehviewer是一款主要用于浏览和下载漫画、插画等二次元图像内容的软件。适用安卓和苹果系统,Ehviewer拥有海量的漫画作品,涵盖各种题材和风格,包括日本漫画、韩国漫画、欧美漫画以及国内的一些同人创作等。无论是热门的商业漫画还是小众的独立作品,都能在Ehviewer上找到,现在已经更......
  • 【Gradle下载】Gradle全部最新版本极速下载安装地址
    Gradle简介  gradle AndroidStudio中的Gradle是一个构建工具系统,主要用于构建、测试和部署Android应用程序。AndroidStudio中的Gradle是一个强大的构建工具系统,为Android开发提供了高效、灵活和可定制的构建流程。它能够帮助开发者管理项目的依赖......
  • 建立“二分查找”的通用模型
    案例[5,7,7,8,8,10]返回非递减数组中第一个≥8的数的位置,如果所有数都<8,返回数组长度暴力做法:遍历每个数,询问是否≥8?时间复杂度O(n)二分查找的模型红蓝染色法:约定如下≥target表示在target右侧标记为蓝色<target表示在target左侧标记为红色1.左闭右闭f......
  • python https 下载文件
    同步下载defdownload_file_block(url:str,file_path:str):logging.basicConfig(level=logging.DEBUG)log=logging.getLogger('requests.packages.urllib3')log.setLevel(logging.DEBUG)log.propagate=TrueclassDebugAdapter(HTTPAd......
  • 无数据备份和无归档文件时,使用bbed修改数据文件头的SCN,强制打开数据库的方法
    在数据库运维中经常会遇到某个数据文件的SCN与其他文件的SCN不一致(如offline后或者异常断电),如果归档日志被删除了,导致datafile不能recover,数据库不能打开情况,这时候我们需要借助bbed修改datafileheader的scn与其他datafile的headerscn一致,然后recoverdatafile。一、问题产生......
  • 为什么DDD通用语言可以拯救中国足球
    DDD领域驱动设计批评文集做强化自测题获得“软件方法建模师”称号《软件方法》各章合集领域驱动设计(DDD)是革命性的创造,是划时代的洞见。其中的通用语言(UbiquitousLanguage)不仅彻底改变了软件开发的面貌,更为各行各业的发展指明了方向。今天,在中国足球叕一次让国人绝望的时......
  • c#和java通用sm4加密
    c#安装BouncyCastle  SM4工具类usingSystem.Text;usingOrg.BouncyCastle.Utilities.Encoders;namespaceStrongOA.Core.Utils{///<summary>///SM4工具类///</summary>publicclassSM4Util{publicstaticstringsecr......
  • 南大通用GBase数据库在江西移动网管系统的国产化替换项目
    项目概况1、项目背景移动网管业务是为了更好地调配和管理网络资源及信息、对网络运行情况进行实时监测并根据业务情况以及网络流量使用情况进行网络资源的合理调配。随着江西移动业务的不断发展,网管系统处理负荷不断增加,系统使用的国外数据库产品版本老旧,系统运行过程中多次遇到数......
  • VMware NSX Advanced Load Balancer (NSX ALB) 22.1.7 发布下载,新增功能概览
    VMwareNSXAdvancedLoadBalancer(NSXALB)22.1.7-多云负载均衡平台应用交付:多云负载均衡、Web应用防火墙和容器Ingress服务请访问原文链接:https://sysin.org/blog/vmware-nsx-alb-22/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org负载均衡平台NSXAdvan......
  • 官网下载easyx压缩包,如何在devc++配置easyx
    视频教程官网下载easyx压缩包,如何在devc++配置easyxEasyXGraphicsLibraryforC++安装指南1.访问官网官网2.下载EasyX在官网上找到下载区域,点击下载按钮以获取EasyX安装包。3.访问更多下载选项点击页面上的“more”链接,以查看更多下载选项。4.下......