仅下载文件的一部分

仅下载文件的一部分

我试图查找是否可以通过axelaria2或任何其他可用工具下载文件的一部分(任何文件)。

例如,有一个电影文件(因为在 A/V 文件中做这种事情是有意义的)。我如何才能只下载文件第一个部分的最后 50MB 或第三个 60Mb?

文件大部分位于 HTTP 服务器上;但可能位于 FTP 服务器上。如果可以通过其他协议下载它们,这也是一种选择。

答案1

是否可以下载文件的一部分取决于用于传输内容的协议。

如果文件可通过 HTTP/1.1 获得,则任何正确支持 Range 标头(请参阅 RFC 2616 的第 14.35 节)的服务器都应该允许您下载该文件的部分内容。

考虑以下文件:

$ cat testfile.txt
12345

如果我使用 nginx(一个支持 Range 标头的网络服务器)提供此服务,我可以下载其中的部分内容(插入换行符以提高可读性):

$ 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 节)。使用与上面相同的 testfile.txt,由 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

我对许多 FTP 客户端不熟悉,所以我不知道是否有这样做,但很可能可以使用 REST 命令读取任何字节子集,然后在获得所需的字节数后停止。

看起来aria2能够使用该标志恢复 HTTP 和 FTP 传输-c。这可能使用上述功能,因为它仅支持 HTTP 和 FTP。但是,它本身似乎并不支持仅下载文件的末尾或中间部分。可以--continue通过在磁盘上创建虚拟文件来利用该标志。如果此文件有 N 个字节,则 aria 可能会从文件的第 N+1 个字节开始。

答案2

curl--range/-r转变,据记录支持 HTTP 和 FTP(甚至 SFTP)协议:

curl --range start-end ftp://example.com/file.ext --output test.ext

答案3

我发现一个简单的方法就是使用head

curl -s https://somedomain.com/file.txt | head -c 1000

这将完成文件的第一个千字节。

在我的用例中,我想解压缩 1GB 的文件内容,所以我这样做:

curl -s https://somedomain.com/file.txt.bz2 | bzcat | head -c 1000 > 1kb-file.txt

爱它!

相关内容