关于 restful 接口的导出下载疑问

2019-05-15 15:50:20 +08:00
 Breadykid

到新公司几个月,发现好多奇怪的实现。 比如他们的生成报表下载文件不是直接下载,而是先上传到服务器上,接口返回服务器上的文件地址,本以为他们需要文件归档或者备份,然而明确需求后只是即时生成下载,运维还特地写了定时删除文件的脚本。 询问了一下开发同事,发现他们习惯于这么实现,甚至不太会直接下载的实现方式(惊了个呀!)。这样把不必要的临时文件保存至服务器,觉得对硬件存储的开销很大,特别是数据量大的报表的存储删除。 请问大家公司里对于 restful 接口下载都是这么实现的吗?个人觉得百害而无一利啊。。。

2015 次点击
所在节点    程序员
17 条回复
cway
2019-05-15 16:00:07 +08:00
难道这样可以断点续下?不知道,不清楚,有的公司 mvc 上都没返回值都是 void 用 HttpServletResponse 返回
Luckyray
2019-05-15 16:01:08 +08:00
安全性?
gz911122
2019-05-15 16:02:03 +08:00
是的 没错

1 不是上传到服务器,是上传到 cdn 之类的专门的地方
2 不确定你指的直接下载指的是什么意思,如果是指的在 service 跑的服务器上做上传下载的话,一是太占带宽,贵而且影响实时性能,二是上传上去之后如果其他地方 or 之后再需要的话从 cdn 获取即可,速度快且对服务器无负担
gz911122
2019-05-15 16:02:23 +08:00
@gz911122 补充一下,我觉得这跟 restful 与否没有任何关系
index90
2019-05-15 16:19:19 +08:00
搞清楚什么是动态资源,什么是静态资源。
如果文件是一次生成多次下载的,这样做没问题。参考一下你怎么用百度网盘共享文件的。
如果文件是动态生成的,可能下一秒文件就不一样了,那它就是动态资源,需要接口直接返回二进制流。
mooncakejs
2019-05-15 16:37:42 +08:00
先生成后下载很合理啊。
1 一次生成多次下载,断点续传,缓存控制。
2 IO 隔离,生成服务器不用承担下载到开销。
Vegetable
2019-05-15 17:25:54 +08:00
我问一下,是不是这样

1.**前端**根据接口数据生成 EXCEL
2.上传到服务器,服务器返回下载地址
3.前端调用下载

如果是这样的话,那我估计真的是不会,这个设计问题很大.

第一次做类似需求之前,我也以为前端不能直接生成下面保存到本地,实际上是可以的.所以我现在设计的报表下载只有两个方向

- 前端直接根据开放接口请求数据,自己塞到表里,保存到本地.
- 前端发送过滤条件,后端直接在内存里生成 EXCEL 之后不保存直接返回.这个对资源的消耗比较不可控,所以在筛选条件上往往做一下限制,避免运营大神一次下全表.

其他的办法也有,但是我司业务体量目前不需要专门跑个 worker 去异步处理,所以就这两种就行了.
但是无论如何万万不会有前端生成再上传下达一次的设计.
Vegetable
2019-05-15 17:27:12 +08:00
*下面 => 文件
oneisall8955
2019-05-16 00:02:34 +08:00
两种都可以,看需求咯~之前做的前后端分离或者单体应用,两个方式都可以的,两个都做过
unco020511
2019-05-16 11:39:40 +08:00
我们以前好像也是这样,因为有专门的资源服务器
Breadykid
2019-05-16 13:15:07 +08:00
@cway 完全没有断点续传的考虑,就是动态生成下载,还存到服务器上去。。。
Breadykid
2019-05-16 13:15:37 +08:00
@Luckyray 什么的安全?下载文件内容的安全 ?
Breadykid
2019-05-16 13:16:26 +08:00
@gz911122 他们完全没有 cdn 呢,就是在工程所在服务器的某个文件夹里。。。
Breadykid
2019-05-16 13:16:50 +08:00
@index90 这个文件就是动态生成的。。。
Breadykid
2019-05-16 13:18:07 +08:00
@mooncakejs 一次生成多次下载确实需要这样做,不过现在功能都是动态报表下载,一次生成只有一次下载,我觉得很浪费资源
Breadykid
2019-05-16 13:18:47 +08:00
@unco020511 他们没有呢,就一个服务器- -
Breadykid
2019-05-16 13:20:02 +08:00
@Vegetable 同意同意,握爪握爪

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/564389

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX