【问题标题】:Perl how to send zip file to browser for download in PSGIPerl如何将zip文件发送到浏览器以在PSGI中下载
【发布时间】:2026-01-06 16:20:05
【问题描述】:

我开始查看 PSGI,我知道应用程序的响应应该是一个数组 三个元素的引用,[代码,标题,正文]:

#!/usr/bin/perl

my $app = sub {
  my $env = shift;

  return [
    200,
    [ 'Content-type', 'text/plain' ],
    [ 'Hello world' ],
  ]
};

问题是如何将文件(例如 zip 或 pdf)发送到浏览器以供下载。

【问题讨论】:

    标签: perl psgi


    【解决方案1】:

    只需设置正确的标题和正文。

    my $app = sub {
      my $env = shift;
    
      open my $zip_fh, '<', '/path/to/zip/file' or die $!;
    
      return [
        200,
        [ 'Content-type', 'application/zip' ], # Correct content-type
        $zip_fh, # Body can be a filehandle
      ]
    };
    

    您可能想尝试添加其他标头(尤其是“Content-Disposition”)。

    【讨论】:

    • 好答案,我应该在返回响应之前在文件上设置binmod $zip_fh;
    【解决方案2】:

    看看perl dancer;它支持 psgi,是一个非常轻量级的框架。

    示例:

     #!/usr/bin/env perl
     use Dancer;
    
     get '/' => sub {
         return send_file('/home/someone/foo.zip', system_path => 1);
     };
    
     dance;
    

    运行 chmod 0755 ./path/to/file.pl; ./path/to/file.pl

    致电:

    wget &lt;host&gt;:&lt;port&gt;/

    【讨论】: