zoukankan      html  css  js  c++  java
  • SpringMVC,SpringBoot文件下载

    前言

    最近严查security, 导致原来暴露出去的s3不能用了,不允许public的s3,暂时的折中方案是自己做跳转。于是需要在SpringMVC中实现文件下载功能。

    关于文件存储的设计

    文件存储通常用作对象存储,业界标准就是AWS s3, 国内的七牛也差不多。不想自建的话,采用这种第三方存储是很方便的。但是,有写地方需要注意。

    安全问题

    就像这次整改遇到的,权限问题大概是对象存储必须具备的。s3的权限特别多和复杂,可以做到认证user访问; 指定ip访问; 指定IAM Role访问; 指定第三方登陆比如Facebook,google的认证,设置自己的认证,这里是指Cognito。

    地址路径的健壮性

    review代码的时候发现了几个严重的问题,地址问题尤为重要,简直就是bug一样。首先,db存储的文件路径不应该包含域名前缀,像这次整改图片存储就导致以前db里的数据不能用了。db只能存储相对路径,即当指定改类型前缀后,变化的部分路径。。 然后就是 需要一个域名,对于公开的地址,需要一个域名来维护,而不是直接指定当前的文件服务器。比如一个公开的s3可能是这样的:https://mybucket.s3.amazonaws.com/keyprefix/key. 如果我们变更了s3的bucket,那么这个地址就废弃了,这个很有可能发生的。因此,用一个我们自己的域名指向s3可以屏蔽这个细节。同理,如果写死了文件服务器的地址,当文件服务器变更的时候,公开的文件将全部失效。

    如何使用SpringMVC下载文件

    我们可以简单的在HttpServletResponse的OutputStream里写入我们的文件流,这样就可以实现文件下载。但这个做法感觉有点太直接了,推荐使用Spring的ResponseEntity来做。

    @RequestMapping(value = "/static/filename")
    public ResponseEntity<InputStreamResource>(HttpServletResponse response) {
        final ObjectMetadata objectMetadata = s3Object.getObjectMetadata();
    
        return ResponseEntity.ok()
                .header("Access-Control-Allow-Origin", "*")
                .cacheControl(CacheControl.maxAge(maxAge, TimeUnit.DAYS).cachePublic())
                .allow(HttpMethod.GET, HttpMethod.OPTIONS)
                .contentLength(objectMetadata.getContentLength())
                .contentType(MediaType.valueOf(objectMetadata.getContentType()))
                .body(new InputStreamResource(s3Object.getObjectContent()));
    }
    
    1. 问题核心在于返回ResponseEntity<InputStreamResource>
    2. ResponseEntity是SpringMVC里统一封装的返回值response信息
    3. InputStreamResource则是接收一个输入流InputStream的结果集
    4. 然后可以设置浏览器缓存,这个对用户刷新页面挺重要的
    5. 对于图片和js等,需要设置contentType为png或者js等
  • 相关阅读:
    LeetCode
    <OFFER15> 15_NumberOf1InBinary
    《OFFER14》14_CuttingRope
    Convert DataFrame string complex i to j python // “Cloning” row or column vectors
    Sorting arrays in NumPy by column
    【説明する】深度优先及宽度优先算法比较
    codevs 2924 数独挑战 x(三种做法+超详细注释~)
    第四次考试大整理
    洛谷 P1048 采药
    codevs 3137-3139 栈练习 x
  • 原文地址:https://www.cnblogs.com/woshimrf/p/springmvc-download-file.html
Copyright © 2011-2022 走看看