94

今天我检查了 mega.co.nz,我对一些功能感到兴奋。例如在下载页面中,它将在浏览器上下载文件,然后使用 javascript 解密它们。

例如,查看此链接以下载 png 文件:

https://mega.co.nz/#!7JRgFJzJ!efpJGWuPhYczLexY19ex82nuwfs4sR_DG4JXddeClH4

在此链接中,它将在浏览器中开始下载。我检查了检查元素中的网络选项卡,它会在完成文件的所有部分后使用 AJAX 下载部分文件,并将所有文件自动保存在计算机上的一个文件中!

我想知道他们做什么?你能解释或链接到一些关于在浏览器中下载文件的资源吗?

也可以只用 javascript 来完成,还是应该使用一些 flash 插件或类似的东西?

4

4 回答 4

107

Mega 使用几种不同的方法来做到这一点:(截至 2013 年 11 月 27 日)

  1. 文件系统 API(Chrome/Firefox 扩展 polyfill)
  2. Adobe Flash SWF Filewriter(旧浏览器后备)
  3. BlobBuilder (IE10/IE11)
  4. MEGA Firefox 扩展(已弃用)
  5. Arraybuffer/Blob(在内存中)+ a[download](对于支持 a[download] 的浏览器)
  6. MediaSource(实验性流媒体解决方案)
  7. 存储在 IndexedDB 存储中的 Blob + a[下载](Firefox 20+,对内存 Blob 方法的改进)

(来源:https ://eu.static.mega.co.nz/js/download_6.js )

于 2013-04-14T01:42:13.450 回答
4

此处介绍了使用 Blob 和 URL API 的多部分浏览器内下载器的基本实现。它下载 4 个并发请求的文件并显示进度。请注意,似乎range在 XHR 请求中设置标头通常不是一个好主意,请查看此主题

下载时:

下载时

下载后:

下载后

另一个有趣的话题是实现 Mega 的暂停/恢复功能。当前浏览器的 XHR API 不提供该功能,因此您唯一的机会是下载多个小块并放弃小块的下载部分,这似乎也在 Mega 上完成。但是fetch流式传输功能可以用于此目的,我对此的探索还不够好,但在此处进行了记录。

顺便说一句,看看这些很棒的项目:

于 2017-12-17T12:44:44.060 回答
2

MEGAcmd

megacmd,官方的命令行界面。您也可以从 github 上的源代码构建它,网址为https://github.com/meganz/MEGAcmd

megacmd是 Mega SDK 的包装器,如果您决定自己编译它,您将需要与下面列出的 Mega SDK 相同的依赖项(在 ubuntu 上)。

有关使用的详细信息,请参阅MEGAcmd 用户指南

超级 SDK

Mega SDK 可以按照github页面上的步骤进行编译。它包括megacli实用程序,它是一个用于同步和下载/上传的交互式 shell。

## compilation steps for ubuntu
git clone --depth 1 https://github.com/meganz/sdk megasdk
cd megasdk
sudo apt install libcurl4-openssl-dev  libc-ares-dev libssl-dev libcrypto++-dev  zlib1g-dev libsqlite3-dev  libfreeimage-dev libswscale-dev
autogen.sh
./configure
make -j 8  ## pass the number of CPUs you have to speed up compilation
sudo make install

mega.py python 模块(已弃用)

对于那些在文本模式下搜索实际配方以下载链接的问题,这里有一个简单的 python 脚本,它使用mega.py模块(安装它sudo pip install mega.py):

import sys
import getpass
#install the module with: 'sudo pip install mega.py'
from mega import Mega

email = '_your_megamail_@domain.com'
password = getpass.getpass(prompt='Mega password for {}:'.format(email))

mega = Mega({'verbose': True})
m = mega.login(email, password)
m.download_url(sys.argv[1])

该脚本适用于 python 2.7,并采用 mega.nz 链接的 URL。

getpass用于在控制台中安全地输入密码,以避免将密码存储在脚本中——如果您愿意对密码进行硬编码,则将其设置在第 7 行中。

megatools

在大多数 Linux/posix 机器上,您可以从标准存储库安装megatools,即

在 ubuntu/debian 上:

apt install megatools

在 MacOS 上:

brew install megatools

安装后,您会发现许多命令行实用程序,megadl其中可以下载共享文件和您自己的文件。详情请参阅megadl -h

于 2017-01-09T23:31:45.537 回答
0

自 2020 年起,您可以使用 Service Workers 将您的自定义代码与浏览器的内置下载管理器无缝集成:https ://developers.google.com/web/updates/2016/06/sw-readablestreams

我还猜想您将拥有以下标头,以便下载而不是查看文件:

 headers: {
   'Content-Type': 'application/octet-stream',
   'Content-Disposition': 'attachment; filename="your_filename.bin"',
 }

就我个人而言,我发现这种方法在 Firefox 和 Google Chrome 中都能完美运行,而且我已经在生产中使用它。

于 2020-10-27T09:57:35.897 回答