《关于我项目改造为Solon这档事》轻松搞定动态文件流

前言

在做NAS文件服务时,使用了主流的web开发框架,脚手架选用SRA-ADMIN。因为服务涉及到一个功能就是要访问文件,所以方案可以有这两个:1、通过配置本地目录映射;2、自定义接口返回文件流;
第一个是很简单的,不过多赘述,但是这个有一个问题是本地目录暴露出去了,存在安全风险,比如通过URL/xxx/11.mp4,就可以预判到你目录存在其它文件(/xxx/12.mp4,13,14…),所以这个方案被pass掉。
第二个就是用来解决第一个的不足之处,通过动态路径/xxxx/{fileId}来获取,但是这里有个问题就是
要自己解决媒体流问题,这不太好办(比如经典的视频进度控制),所以还是去网上找了找文章,通过实现这个类【ResourceHttpRequestHandler】解决了,代码如下:
处理器:

@Component
public class NonStaticResourceHttpRequestHandler extends ResourceHttpRequestHandler {
    public final static String ATTR_FILE = "NON-STATIC-FILE";
    @Override
    protected Resource getResource(HttpServletRequest request) {
        Object attribute = request.getAttribute(ATTR_FILE);
        final Path filePath = (Path) attribute;
        return new FileSystemResource(filePath);
    }
}

自定义接口调用:

        request.setAttribute(NonStaticResourceHttpRequestHandler.ATTR_FILE, resource.toPath());
        response.setContentType(Files.probeContentType(resource.toPath()));
        nonStaticResourceHttpRequestHandler.handleRequest(request, response);

回归主题

在改造springboot项目到Solon时,遇到这么个情况,因为看文档没有类似ResourceHttpRequestHandler 的东西,所以以为只能配置静态目录了吗,最后问到答案的时候惊呆了,Solon的文件流更加简单,几行代码就搞定了,示例代码如下:

    @Mapping(value = "/media", method = MethodType.GET)
    public DownloadedFile media() throws FileNotFoundException {
        DownloadedFile file = new DownloadedFile(new File("C:\\Users\\xxxxx\\Downloads\\1665669595.mp4"));
        return file;
    }

附上:Solon静态文件动态接口处理文档位置:https://solon.noear.org/article/313

预判追问

  1. 为什么突然改造Solon?
    在这里插入图片描述
    上图的Solon特色,然后NAS服务当然希望资源利用率越小越好啊~

  2. 优化下springboot项目或者使用原生编译也可以达到差不多的效果
    这个其实有尝试过但是坑是有很多要踩,所以引用改造下python那句名言:人生苦短,我用Solon。易用+高性能,便是最终的解决方案。

  3. 这样改造整个项目不是更花时间吗?
    其实,目前业务不多,而且趁这个机会,但也是幸好早点认识了Solon框架,所以天时地利人和,那就改造吧。

最后补充

  • 由于文件接口是代理的,所以服务会存在强制断开通信异常,这个记得处理下
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值