今天我检查了mega.co.nz,我很兴奋一些功能。 例如,在下载页面中,它将在浏览器上下载文件,之后用javascript解密它们。
例如,请参阅此链接以下载png文件:
https://mega.co.nz/#!7JRgFJzJ!efpJGWuPhYczLexY19ex82nuwfs4sR_DG4JXddeClH4
在此链接中,它将在浏览器中开始下载。我检查了检查元素中的网络选项卡,它将在完成文件的所有部分之后用AJAX下载部分文件,将所有文件自动保存在计算机上的一个文件中!
我想知道他们做了什么?你可以解释或链接到某些关于浏览器内部下载文件的资源吗?
也可以只使用javascript或者应该使用一些flash插件或类似的东西吗?
答案 0 :(得分:93)
Mega使用几种不同的方法来做到这一点:(截至2013年11月27日)
答案 1 :(得分:3)
官方命令行界面megacmd。您也可以在https://github.com/meganz/MEGAcmd
的github上从源代码构建它 megacmd
是Mega SDK的包装器,如果您决定自己编译它,您将需要与下面列出的Mega SDK相同的依赖项(在ubuntu上)。
有关使用的详细信息,请参阅MEGAcmd User Guide。
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脚本(用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,即
apt install megatools
brew install megatools
安装完成后,您会发现许多命令行实用程序,其中megadl
可以下载共享文件和您自己的文件。有关详细信息,请参阅megadl -h
。
答案 2 :(得分:3)
使用Blob和URL API实现多部分浏览器下载程序的基本实现here。它在4个并发请求上下载文件并显示进度。请注意,设置range
标题似乎对XHR请求通常不是一个好主意,请查看this topic。
下载时:
下载后:
另一个有趣的话题是Mega实现Pause / Resume功能。当前浏览器的XHR API不提供这种功能,所以你唯一的机会就是下载和放弃你小块的下载部分的多个小尺寸块,就像Mega一样。但是fetch
流式传输功能可用于此目的,我还没有很好地探索它,但记录在案here。
答案 3 :(得分: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浏览器中都可以正常使用,并且已经在生产环境中使用。