使用HTTP分块标题发送未知大小的数据的示例?

时间:2019-06-08 05:02:38

标签: http chunked

在阅读了一些帖子和维基百科之后,我仍然不清楚chunked标头用法的实际示例。

我从Content-Length header versus chunked encoding看到的一个例子是:

  

另一方面,如果内容长度确实不可预测   事先(例如,当您打算将多个文件压缩在一起时,   将其作为一个发送),然后分块发送可能比   将其缓冲在服务器的内存中或写入本地磁盘文件系统   首先。

所以这意味着我可以在压缩文件的同时发送压缩文件?怎么样 ?

我还注意到,如果下载GitHub存储库,我将在chunked中接收数据。 GitHub是否也以这种方式发送文件(在压缩时发送)?

一个最小的例子将不胜感激。 :)

1 个答案:

答案 0 :(得分:0)

这里是一个使用perl(带有IO :: Compress :: Zip模块)以@deceze指向的方式动态发送压缩文件的示例。

use IO::Compress::Zip qw(:all);

my @files = ('example.gif', 'example1.png'); # here are some files

my $path = "/home/projects/"; # files location

# here is the header
print "Content-Type: application/zip\n"; # we are going to compress to zip and send it
print "Content-Disposition: attachment; filename=\"zip.zip\"\r\n\r\n"; # zip.zip for example is where we are going to zip data

my $zip = new IO::Compress::Zip;

foreach my $file (@files) {
  $zip->newStream(Name => $file, Method => ZIP_CM_STORE); # storing files in zip
  open(FILE, "<", "$path/$file");
  binmode FILE; # reading file in binary mode

  my ($buffer, $data, $n);

  while (($n = read FILE,$data, 1024) != 0) { # reading data from file to the end
     $zip->print($data); # print the data in binary
  }

  close(FILE);
}
$zip->close;

正如您在脚本中看到的那样,即使您在标题中添加zip文件名也没关系,因为我们正在压缩文件并立即以二进制模式打印它,因此无需压缩数据并存储它们,然后将其发送给客户端,您可以直接压缩文件并打印它们,而无需存储它们。