Примеры, которые отправляют данные неизвестного размера с фрагментированным заголовком http?

У меня до сих пор нет четкого представления о практических примерах использования заголовка chunked после прочтения некоторых сообщений и Википедии.

Один из примеров, который я вижу в заголовке Content-Length по сравнению с фрагментированной кодировкой, это:

С другой стороны, если длина содержимого действительно непредсказуема заранее (например, когда вы намерены заархивировать несколько файлов вместе и отправить их как один), то отправка их фрагментами может быть быстрее, чем буферизация в памяти сервера или запись на локальный диск. файловая система в первую очередь.

Значит, я могу отправлять zip-файлы, пока я их архивирую? Как ?

Я также заметил, что если я загружаю репозиторий GitHub, я получаю данные в chunked. GitHub также отправляет файлы таким образом (отправка во время архивирования)?

Был бы очень признателен минимальный пример. :)


person Rick    schedule 08.06.2019    source источник
comment
«Я могу отправлять zip-файлы, пока я их архивирую? Как? » - программа, которая создает сжатый файл, просто выводит поток байтов. Если вы запишете это в файл на диске, у вас будет ZIP-файл. Но вы также можете просто вывести этот поток через HTTP на лету. Как именно это сделать, зависит от вашего языка программирования.   -  person deceze♦    schedule 08.06.2019
comment
@deceze Хм ... Я понял. Но я хочу увидеть реальный пример кода: 0. Примеры Python C ++ php в порядке. Любой материал рекомендуется?   -  person Rick    schedule 08.06.2019


Ответы (1)


Вот пример использования 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 в заголовок, это не имеет значения, потому что мы сразу же архивируем файлы и печатаем их в двоичном режиме, поэтому нет необходимости заархивировать данные и хранить их. затем отправьте его клиенту, вы можете напрямую заархивировать файлы и распечатать их, не сохраняя их.

person Mobrine Hayde    schedule 08.06.2019