Tải xuống các tệp như mega.co.nz


89

Hôm nay tôi đã kiểm tra mega.co.nz và tôi rất vui mừng về một số tính năng. Ví dụ: trong trang tải xuống, nó sẽ tải xuống các tệp trên trình duyệt và sau đó giải mã chúng bằng javascript.

Ví dụ: xem liên kết này để tải xuống tệp png:

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

trong liên kết này, nó sẽ bắt đầu tải xuống bên trong trình duyệt. Tôi đã kiểm tra tab mạng trong phần tử kiểm tra, nó sẽ tải xuống các phần của tệp bằng AJAX sau khi hoàn thành tất cả các phần của tệp, sẽ tự động lưu tất cả chúng vào một tệp trên máy tính!

tôi muốn biết họ làm gì? bạn có thể giải thích hoặc liên kết đến một số tài nguyên về các tệp tải xuống bên trong trình duyệt như vậy không?

cũng có thể làm điều đó chỉ với javascript hoặc nên sử dụng một số plugin flash hoặc thứ gì đó tương tự?


3
Yeah, và nếu bạn tải về một tập tin lớn hệ thống chậm như rùa bò vì sự phân trang liên tục
kinokijuf

Câu trả lời:


102

Mega sử dụng một số phương pháp khác nhau để thực hiện việc này: (kể từ ngày 27 tháng 11 năm 2013)

  1. API hệ thống tệp (Polyfill Tiện ích mở rộng Chrome / Firefox)
  2. Adobe Flash SWF Filewriter (dự phòng trình duyệt cũ)
  3. BlobBuilder (IE10 / IE11)
  4. MEGA Tiện ích mở rộng Firefox (không được dùng nữa)
  5. Bộ đệm mảng / Blob (trong bộ nhớ) + a [tải xuống] (dành cho các trình duyệt hỗ trợ [tải xuống])
  6. MediaSource (giải pháp phát trực tuyến thử nghiệm)
  7. Blob được lưu trữ trong bộ nhớ IndexedDB + a [tải xuống] (Firefox 20+, cải tiến so với phương pháp Blob trong bộ nhớ)

(nguồn: https://eu.static.mega.co.nz/js/download_6.js )


nhưng tôi nghĩ rằng nó cũng hoạt động trên firefox. tôi đã tìm thấy một mẫu ở đây jsfiddle.net/kGLnP/5 . mẫu này hoạt động chính xác trên chrome và firefox. nhưng họ làm gì cho các trình duyệt khác như safari hoặc opera? tôi có thể tải về các liên kết mega.co.nz với những trình duyệt này quá ..
Amir Molaa

1
Có, mẫu bạn cung cấp ( jsfiddle.net/kGLnP/5 ) sẽ hoạt động với Firefox, nhưng chỉ những mẫu mới nhất (phiên bản 20 trở lên, hãy xem developer.mozilla.org/en-US/docs/HTML/Element/a để biết thêm thông tin về hỗ trợ). Tôi vừa đọc mã JavaScript của Mega và cập nhật câu trả lời của mình. (Nó sẽ trả lời câu hỏi của bạn về các trình duyệt khác Về cơ bản, họ sẽ phải dùng đèn flash khi họ không thể sử dụng JS-giải pháp duy nhất..)
roberto

Ồ, tôi vừa xem trang web này ngày hôm qua và sẽ hỏi câu hỏi tương tự. Khi tôi cố gắng tải xuống một bản mod Game, tôi đã rất ngạc nhiên khi bắt đầu tải xuống ngay lập tức bên trong trình duyệt hiển thị tốc độ đầy đủ của tôi !!! Tôi đã sử dụng FF 20.0.1.
Chào mừng

Câu trả lời của roberto có còn cập nhật không? Tôi đã thử tải xuống một tệp lớn từ mega.co.nz trong firefox và tắt flash và nó vẫn hoạt động. Khi cố gắng tải xuống một tệp lớn, firefox đang yêu cầu phê duyệt để lưu trữ hơn 50MB, điều này khiến tôi nghĩ rằng họ sử dụng indexedDB.
shacharz

1
Không, nó không (thực sự) được cập nhật, tập lệnh tải xuống hiện tại ở đây: eu.static.mega.co.nz/download_46.js . Tôi đã xem nhanh và nó vẫn ít nhiều giống với các thủ thuật với một số bổ sung mới, bao gồm cải thiện hiệu suất bằng cách lưu vào bộ nhớ đệm (sử dụng IndexedDB, như bạn đã đoán). Tôi sẽ cập nhật câu trả lời của mình khi tôi có thời gian để đọc mã.
roberto

4

Triển khai cơ bản của trình tải xuống nhiều phần trong trình duyệt bằng cách sử dụng các API Blob và URL được giới thiệu ở đây . Nó tải xuống một tệp trên 4 yêu cầu đồng thời và cũng hiển thị tiến trình. Xin lưu ý rằng có vẻ như thiết lập rangetiêu đề nói chung có thể không phải là một ý tưởng hay đối với các yêu cầu XHR, hãy xem chủ đề này .

Trong khi tải xuống:

Trong khi tải xuống

Sau khi tải xuống:

Sau khi tải xuống

Một chủ đề thú vị khác sẽ là triển khai chức năng Tạm dừng / Tiếp tục từ Mega. API XHR của các trình duyệt hiện tại không cung cấp khả năng đó vì vậy cơ hội duy nhất bạn có là thực hiện tải xuống nhiều phần có kích thước nhỏ và từ bỏ phần đã tải xuống của các phần nhỏ của bạn, theo cách nó có vẻ cũng được thực hiện trên Mega. Nhưng fetchtính năng phát trực tuyến có thể được sử dụng cho mục đích đó, tôi chưa khám phá điều đó đủ nhưng nó được ghi lại ở đây .

Btw, hãy xem những dự án tuyệt vời này:


3

MEGAcmd

megacmd , giao diện dòng lệnh chính thức. Bạn cũng có thể xây dựng nó từ các nguồn trên github tại https://github.com/meganz/MEGAcmd

megacmd là một trình bao bọc xung quanh Mega SDK và nếu bạn quyết định tự biên dịch nó, bạn sẽ cần các phần phụ thuộc tương tự (trên ubuntu) như các phần được liệt kê bên dưới cho Mega SDK.

Để biết chi tiết về cách sử dụng, hãy xem Hướng dẫn sử dụng MEGAcmd .

Mega SDK

Mega SDK có thể được biên dịch bằng cách làm theo các bước trên trang github . Nó bao gồm megaclitiện ích là một trình bao tương tác để đồng bộ hóa và tải xuống / tải lên.

## 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 mô-đun python (không được dùng nữa)

Đối với những người tìm thấy câu hỏi này đang tìm kiếm một công thức thực tế để tải xuống một liên kết ở chế độ văn bản, đây là một tập lệnh python đơn giản sử dụng mô-đun mega.py (cài đặt nó với 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])

Tập lệnh hoạt động với python 2.7 và lấy URL của liên kết mega.nz.

getpass được sử dụng để nhập mật khẩu một cách an toàn vào bảng điều khiển nhằm tránh lưu mật khẩu trong tập lệnh - nếu bạn cảm thấy thoải mái khi mã hóa mật khẩu, hãy đặt nó ở dòng số 7.

megatools

Trên hầu hết các hộp Linux / posix, bạn có thể cài đặt megatools từ các kho tiêu chuẩn, tức là

Trên ubuntu / debian:

apt install megatools

Trên MacOS:

brew install megatools

Sau khi cài đặt, bạn sẽ tìm thấy một số tiện ích dòng lệnh, trong số megadlđó có thể tải xuống cả tệp được chia sẻ và tệp của riêng bạn. Xem megadl -hđể biết chi tiết.


0

Kể từ năm 2020, bạn có thể sử dụng Service worker để tích hợp liền mạch mã tùy chỉnh của mình với trình quản lý tải xuống tích hợp sẵn của trình duyệt: https://developers.google.com/web/updates/2016/06/sw-readablestreams

Tôi cũng đoán bạn sẽ có các tiêu đề sau để tải tệp xuống thay vì xem:

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

Cá nhân tôi nhận thấy phương pháp này hoạt động hoàn hảo trong cả Google Chrome trong Firefox và tôi đã sử dụng nó trong phiên bản sản xuất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.