Baixar apenas uma parte de um arquivo

5

Estou tentando descobrir se é possível fazer o download de uma parte de um arquivo (qualquer arquivo) via axel ou aria2 ou qualquer outra ferramenta disponível.

Por exemplo, há um arquivo de filme (porque fazer esse tipo de coisa faz sentido em arquivos A / V). Como eu poderia baixar apenas os últimos 50MB ou os terceiros 60Mb do primeiro arquivo?

    
por r004 25.03.2014 / 07:12

1 resposta

8

O fato de você poder ou não baixar uma parte de um arquivo depende do protocolo usado para transferir o conteúdo.

Se os arquivos estiverem disponíveis em HTTP / 1.1, qualquer servidor que suporte corretamente o cabeçalho Range (consulte a seção 14.35 do RFC 2616) deverá permitir o download de partes do arquivo.

Considere o seguinte arquivo:

$ cat testfile.txt
12345

Se eu servir isso com o nginx, um servidor que suporta o cabeçalho Range, eu posso baixar partes dele (novas linhas inseridas para legibilidade):

$ 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

Este é o mesmo recurso que curl, wget e outros clientes HTTP usam para "retomar" transferências interrompidas.

O protocolo FTP fornece a continuação de uma transferência de arquivo em um determinado deslocamento por meio do comando RESTART (REST) (consulte a seção 4.1.3 do RFC 959). Usando o mesmo testfile.txt acima, servido pelo FTP:

$ 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

Eu não estou familiarizado com muitos clientes FTP, então não sei se alguém faz isso, mas provavelmente seria possível ler qualquer subconjunto de bytes usando o comando REST e, em seguida, simplesmente parando assim que você tiver o número de bytes que você quer.

Parece que aria2 é capaz de retomar as transferências HTTP e FTP com o sinalizador -c . Isso provavelmente usa os recursos acima, pois é suportado apenas por HTTP e FTP. No entanto, ele não parece oferecer suporte nativo ao download apenas do segmento final ou médio de um arquivo. Pode ser possível explorar o sinalizador --continue criando um arquivo fictício no disco. Se este arquivo tivesse N bytes, talvez a ária fosse iniciada no byte N + 1 do arquivo.

    
por 25.03.2014 / 08:33