跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 技术调研:云文件打包压缩下载至客户端,不在服务器落盘
未分類
24 11 月 2020

技术调研:云文件打包压缩下载至客户端,不在服务器落盘

技术调研:云文件打包压缩下载至客户端,不在服务器落盘

資深大佬 : Visitor233 3

RT,现在文件都是放在阿里云 OSS 存储。客户多选文件下载,肯定是打包成一个压缩包的。我现在是将文件流 stream 放在 dic 字典里,然后运行 ICSharpCode.SharpZipLib 这个包里的 Zip.ZipOutputStream 方法进行后续处理,将生成的 byte 放在 response 的 body 里。前端再下载响应内容。

试了下,下载几张图片是正常的压缩包形式,解压正常。但下载内容包含一个 400 多 M 的视频时,服务就卡了 2 分钟,然后前端下了个空压缩包。

请大佬们指点下,老实说我感觉这方法不靠谱。

大佬有話說 (17)

  • 資深大佬 : kingfalse

    大文件不压缩呗?

  • 資深大佬 : xuanbg

    落盘就是正常的文件下载,客户端可以断线续传,可以分段下载,可以……各种骚操作。不落盘你还能玩什么?多来几个大文件同时下载,别的不说,你服务器的内存就要爆掉了。

  • 資深大佬 : imdong

    使用 JS 加载回来后在浏览器端进行打包处理?

    但是我不知道 zip 之类的压缩是否需要等所有文件都加载完毕后才能生成压缩文件的头部。

    如果有可以顺序加载的话,可以考虑客户端一边读取一边生成压缩包下载。

  • 資深大佬 : xuanbg

    @imdong 没压缩完文件长度都不知道啊,怎么生成头部?

  • 資深大佬 : imdong

    查了一下 zip 的包结构(不确定是否正确)

    “`
    [local file header + file data + data descriptor]{1,n} + central directory + end of central directory record
    即
    [文件头+文件数据+数据描述符]{此处可重复 n 次}+核心目录+目录结束标识

    当压缩包中有多个文件时,就会有多个[文件头+文件数据+数据描述符]
    “`

    如果包结构是这样的话,应该是可以做到 边加载 边压缩 边输出下载。

    应该叫 流压缩?那九成九是已经有现成的轮子可以用(除非无法实现)。

    至于是在浏览器端处理还是在服务端处理,见仁见智吧。

  • 主 資深大佬 : Visitor233

    @xuanbg 我也是这么觉得的,400M,我的小电脑就死了。
    @kingfalse 现在不确定用户的文件大小,而且项目赶,求稳。
    @imdong 涨知识了,之前在阿里文档中看到过一篇介绍边下载边解压的技术,可惜没提供代码

  • 資深大佬 : imdong

    @xuanbg 如一所说,不压缩,只归档,我们应该是可以做到提前知道文件的一些已知信息如大小。

  • 資深大佬 : wanguorui123

    HTTP 实时返回压缩流,不要打包再下载

  • 資深大佬 : Akkuman

    可以实现,golang 中就有类似的,打包的输出流写入 resp writer,不断 flush

  • 資深大佬 : shuax

    搞 tar 格式,别压缩

  • 資深大佬 : imdong

    https://stuk.github.io/jszip/documentation/examples/downloader.html

    看到这个 jszip 的库可以实现在客户端加载远程文件生成压缩文件输出到下载。

    但是这个似乎需要等所有的文件都加载完毕后才能压缩并输出下载,大文件可能会造成浏览器崩溃?

    应该有更佳实现,同步输出下载的,@Akkuman #9 证明这种方案是一定可行的。

    至于如何实现,抛针引线,主自己努力找一下吧。

  • 資深大佬 : okaku

    这些可以在前端解决。zip 本身支持无压缩只归档。
    但是在前端无法实现从浏览器下载管理器中的断点续传。只能从 web 页面上断点续传。
    前端实现在对一些手机浏览器的兼容上有差异。

  • 資深大佬 : Joyuce

    服务器打包上传 oss,给客户端链接,带宽压力不就在 oss 了

  • 資深大佬 : Fred0410

    teambition 的网盘用的就是这个放方法

  • 資深大佬 : wangritian

    ecs 的流量很贵吧,给 oss 开 cdn,带宽峰值收费,下载 api 拆成 2 个,1 个接收文件列表、指定压缩包路径、异步打包、立即返回路径,此时界面可以显示“正在压缩…”,第 2 个循环访问 cdn 路径,直到成功下载或超时

  • 資深大佬 : wunonglin

    oss 不是有打包的计算函数?直接用不就行了?

  • 資深大佬 : forcecharlie

    @imdong HTTP chunk 编码可以满足
    @xuanbg 如果使用 Golang 直接将 Zip 的输出流 io.Copy 到 http.ResponseWriter 内存消耗也比较低 实际上压缩都可以这么玩,就算是 tar.gz 也可以这样压缩解压输出到 HTTP 响应,并不需要占用很多的内存,但 CPU 反正不低,Git 代码托管平台存储库 archive 下载很多就是这个思路,当然其中涉及到缓存,即通过 io.MultiWriter 写入到磁盘和 Hash.

    C# 的则需要自己封装一下。

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具