前言
在做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
预判追问
-
为什么突然改造Solon?
上图的Solon特色,然后NAS服务当然希望资源利用率越小越好啊~ -
优化下springboot项目或者使用原生编译也可以达到差不多的效果
这个其实有尝试过但是坑是有很多要踩,所以引用改造下python那句名言:人生苦短,我用Solon。易用+高性能,便是最终的解决方案。 -
这样改造整个项目不是更花时间吗?
其实,目前业务不多,而且趁这个机会,但也是幸好早点认识了Solon框架,所以天时地利人和,那就改造吧。
最后补充
- 由于文件接口是代理的,所以服务会存在强制断开通信异常,这个记得处理下