V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Breadykid
V2EX  ›  程序员

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

  •  
  •   Breadykid ·
    breadkid · 2019-05-15 15:50:20 +08:00 · 2094 次点击
    这是一个创建于 2018 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    17 条回复    2019-05-16 13:20:02 +08:00
    cway
        1
    cway  
       2019-05-15 16:00:07 +08:00
    难道这样可以断点续下?不知道,不清楚,有的公司 mvc 上都没返回值都是 void 用 HttpServletResponse 返回
    Luckyray
        2
    Luckyray  
       2019-05-15 16:01:08 +08:00
    安全性?
    gz911122
        3
    gz911122  
       2019-05-15 16:02:03 +08:00
    是的 没错

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

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

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

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

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

    其他的办法也有,但是我司业务体量目前不需要专门跑个 worker 去异步处理,所以就这两种就行了.
    但是无论如何万万不会有前端生成再上传下达一次的设计.
    Vegetable
        8
    Vegetable  
       2019-05-15 17:27:12 +08:00
    *下面 => 文件
    oneisall8955
        9
    oneisall8955  
       2019-05-16 00:02:34 +08:00 via Android
    两种都可以,看需求咯~之前做的前后端分离或者单体应用,两个方式都可以的,两个都做过
    unco020511
        10
    unco020511  
       2019-05-16 11:39:40 +08:00
    我们以前好像也是这样,因为有专门的资源服务器
    Breadykid
        11
    Breadykid  
    OP
       2019-05-16 13:15:07 +08:00
    @cway 完全没有断点续传的考虑,就是动态生成下载,还存到服务器上去。。。
    Breadykid
        12
    Breadykid  
    OP
       2019-05-16 13:15:37 +08:00
    @Luckyray 什么的安全?下载文件内容的安全 ?
    Breadykid
        13
    Breadykid  
    OP
       2019-05-16 13:16:26 +08:00
    @gz911122 他们完全没有 cdn 呢,就是在工程所在服务器的某个文件夹里。。。
    Breadykid
        14
    Breadykid  
    OP
       2019-05-16 13:16:50 +08:00
    @index90 这个文件就是动态生成的。。。
    Breadykid
        15
    Breadykid  
    OP
       2019-05-16 13:18:07 +08:00
    @mooncakejs 一次生成多次下载确实需要这样做,不过现在功能都是动态报表下载,一次生成只有一次下载,我觉得很浪费资源
    Breadykid
        16
    Breadykid  
    OP
       2019-05-16 13:18:47 +08:00
    @unco020511 他们没有呢,就一个服务器- -
    Breadykid
        17
    Breadykid  
    OP
       2019-05-16 13:20:02 +08:00
    @Vegetable 同意同意,握爪握爪
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2800 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:25 · PVG 22:25 · LAX 06:25 · JFK 09:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.