Создание файла на лету и возврат на лету (Perl) - PullRequest
2 голосов
/ 04 мая 2011

Мне нужно создать файл на основе пользовательских данных на сервере.Верните этот файл.Теперь я не хочу, чтобы файлы возвращались пользователю (в противном случае они заполнят мое дисковое пространство).Есть ли хороший способ сделать это?Я должен сделать это на Perl.

Спасибо.

Ответы [ 2 ]

5 голосов
/ 04 мая 2011

Если вы создаете zip-файл и немедленно отправляете его обратно клиенту, у вас есть много вариантов.

Вы можете использовать writeToFileHandle в сочетании с IO::Scalar, чтобы записать данные zip-файла прямо в строку и отправить их обратно. Этот подход полностью исключает проблему с файлом.

Вы также можете использовать writeToFileHandle в сочетании с File::Temp для записи во временный файл и последующей потоковой передачи этого файла. Опция UNLINK для File::Temp также поможет вам автоматически очистить временный файл.

0 голосов
/ 22 сентября 2017

Это то, что я создал и работает для меня.Когда пользователь открывает какой-то URL на моей странице, я создаю ZIP-архив на лету и отправляю его пользователю.

Если изменить "-" на "file.zip", он сохранит архив на ваш хостинг / сервер (и не нужно печатать "тип контента").

Пробовал с файлами большого размера (400-500Мб каждый файл) - все в порядке.

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

   my @files = ('example.gif', 'example1.png', 'example2.jpg', 'example3.avi', 'example4.mov');

   my $path = "/home/********/**********";

   print "Content-Type:application/zip\n";
   print "Content-Disposition: attachment; filename=\"filename.zip\"\n\n";

   my $z;

   foreach my $file (@files) {
      if ($z) {
         $z->newStream(Name => $file, Method => ZIP_CM_STORE);
      } else {
         $z = new IO::Compress::Zip "-", Name => $file, Method => ZIP_CM_STORE;
      }

      open(FILE, "<", "$path/$file");
      binmode FILE;

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

      while (($n = read FILE,$data, 1024) != 0) {
         $z->print($data);
      }

      close(FILE);
   }

   $z->close;

   exit;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...