web-dev-qa-db-ja.com

ファイルの一部のみをダウンロードする

axelまたはaria2またはその他の利用可能なツールを使用して、ファイルの一部(任意のファイル)をダウンロードできるかどうかを調べています。

たとえば、ムービーファイルがあります(この種のことを行うことはA/Vファイルで意味があるため)。ファイルの最初から最後の50MBまたは3番目の60Mbのみをダウンロードするにはどうすればよいですか?

6
r004

ファイルの一部をダウンロードできるかどうかは、コンテンツの転送に使用されているプロトコルによって異なります。

ファイルがHTTP/1.1経由で利用できる場合、Rangeヘッダー(RFC 2616のセクション14.35を参照)を正しくサポートするサーバーであれば、ファイルの一部をダウンロードできるはずです。

次のファイルについて考えてみます。

$ cat testfile.txt
12345

RangeヘッダーをサポートするWebサーバーであるnginxを使用してこれを提供すると、その一部をダウンロードできます(読みやすくするために改行が挿入されています)。

$ curl --header "Range: bytes=2-3" https://localhost/testfile.txt -k
34
$ curl --header "Range: bytes=0-1" https://localhost/testfile.txt -k
12 
$ curl --header "Range: bytes=4-" https://localhost/testfile.txt -k
5

これは、curl、wget、および他のHTTPクライアントが中断された転送を「再開」するために使用する機能と同じです。

FTPプロトコルは、RESTART(REST)コマンドを介して特定のオフセットでファイル転送を再開することを提供します(RFC 959のセクション4.1.3を参照)。 FTPで提供される上記と同じtestfile.txtを使用:

$ touch testfile.txt
$ ftp localhost
Connected to localhost.
220 (vsFTPd 2.2.2)
Name (localhost:steve): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> rest 3
restarting at 3. execute get, put or append to initiate transfer
ftp> get testfile.txt
local: testfile.txt remote: testfile.txt
200 PORT command successful. Consider using PASV.
350 Restart position accepted (3).
150 Opening BINARY mode data connection for testfile.txt (6 bytes).
226 Transfer complete.
3 bytes received in 0.00 secs (19.1 kB/s)
ftp> 221 Goodbye.
$ cat testfile.txt
45

私は多くのFTPクライアントに精通していないので、これを行うかどうかはわかりませんが、RESTコマンドを使用して、単に停止することで、バイトのサブセットを読み取ることができる可能性があります。必要なバイト数が得られたら。

aria2は、-cフラグを使用して、HTTP転送とFTP転送の両方を再開できるようです。これは、HTTPとFTPでのみサポートされているため、上記の機能を使用している可能性があります。ただし、ファイルの最後または中間のセグメントのみのダウンロードをネイティブにサポートしているようには見えません。ディスク上にダミーファイルを作成することにより、--continueフラグを悪用する可能性があります。このファイルのバイト数がNの場合、おそらくariaはファイルのN +1バイトから始まります。

9
Steven D