下载mega.co.nz之类的文件


89

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

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

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

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

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

还可以仅使用javascript做到这一点,还是应该使用一些Flash插件或类似的东西?


3
是的,如果您下载大文件,则由于不断的分页,系统会降低抓取的速度
kinokijuf 2014年

Answers:


102

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]的浏览器)
  6. MediaSource(实验性流解决方案)
  7. Blob存储在IndexedDB存储中+ a [下载](Firefox 20+,对内存Blob方法的改进)

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


但我认为它也可以在Firefox上使用。我在jsfiddle.net/kGLnP/5中找到了一个示例。此示例可在chrome和firefox上正常工作。但是它们对野生动物园或歌剧等其他浏览器的作用是什么?我可以下载mega.co.nz链接这些浏览器太..
阿米尔Molaa

1
是的,你提供的样品(jsfiddle.net/kGLnP/5)应该工作的Firefox,但只有那些最新(版本20或更高版本,请developer.mozilla.org/en-US/docs/HTML/Element/a为有关支持的更多信息)。我刚刚阅读了Mega的JavaScript代码并更新了答案。(它将回答您有关其他浏览器的问题。从根本上讲,当它们无法使用仅JS解决方案时,他们将诉诸于Flash。)
roberto 2013年

哇,我昨天刚看到这个网站,并打算问同样的问题。当我尝试下载Game mod时,我很惊讶下载立即开始在浏览器中显示我的全速!我正在使用FF 20.0.1。
2013年

roberto的答案仍然是最新的吗?我尝试从Firefox中从mega.co.nz下载一个大文件并禁用Flash,但该文件仍然有效。当尝试下载大文件时, firefox要求批准存储50MB以上的内存,这使我认为他们使用了indexedDB。
shacharz 2013年

1
不,不是(真的)是最新的,当前的下载脚本在此处:eu.static.mega.co.nz/download_46.js。我快速浏览了一下,发现其中一些新功能还是差不多,它们包括通过缓存(如您所料,使用IndexedDB)提高了性能。有时间阅读代码时,我将更新答案。
roberto

4

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

下载时:

下载时

下载后:

下载后

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

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


3

巨型cmd

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

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

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

超级SDK

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

## 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详细信息,请参见。


0

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

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

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

我个人发现,这种方法在Firefox中的Google Chrome浏览器中都可以正常使用,并且已经在生产环境中使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.