动态创建文件并即时返回(Perl)

时间:2011-05-04 04:50:28

标签: perl file

我必须根据服务器上的用户输入创建一个文件。返回该文件。 现在,一旦文件返回给用户,我不想要文件(否则它们将填满我的磁盘空间)。 有这样做的好方法吗? 我必须在Perl中做到这一点。

谢谢。

2 个答案:

答案 0 :(得分:5)

如果您正在构建一个zip文件并立即将其发送回客户端,那么您有很多选择。

您可以使用writeToFileHandle结合IO::Scalar将zip文件数据直接写入字符串并将其发回。这种方法完全避免了整个文件问题。

您还可以使用writeToFileHandleFile::Temp结合来写入临时文件,然后再将该文件流式传输。 UNLINK的{​​{1}}选项也可以帮助您自动清理临时文件。

答案 1 :(得分:0)

这是我创造并为我工作的。当用户在我的页面上打开一些URL时,我正在创建ZIP存档并将其发送给用户。

如果改变" - " to" file.zip"它会将存档保存到您的主机/服务器中(并且不需要打印"内容类型")。

尝试使用大尺寸文件(每个文件400-500Mb) - 一切正常。

   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;