gpt4 book ai didi

perl - 如何使用 Perl 提供大文件以供下载?

转载 作者:行者123 更新时间:2023-12-04 10:22:28 25 4
gpt4 key购买 nike

我需要提供一个大文件 (500+ MB) 以从 Web 服务器无法访问的位置下载。我找到了问题 Serving large files with PHP ,这与我的情况相同,但我使用的是 Perl 而不是 PHP。

我尝试简单地逐行打印文件,但这不会导致浏览器在抓取整个文件之前提示下载:

use Tie::File;

open my $fh, '<', '/path/to/file.txt';
tie my @file, 'Tie::File', $fh
or die 'Could not open file: $!';
my $size_in_bytes = -s $fh;
print "Content-type: text/plain\n";
print "Content-Length: $size_in_bytes\n";
print "Content-Disposition: attachment; filename=file.txt\n\n";
for my $line (@file) {
print $line;
}
untie @file;
close $fh;
exit;

Perl 是否有相当于 PHP 的 readfile()函数(如 PHP 所建议的那样)或者有没有办法完成我在这里尝试做的事情?

最佳答案

如果您只想将输入输出到输出,这应该可以解决问题。

use Carp ();

{ #Lexical For FileHandle and $/
open my $fh, '<' , '/path/to/file.txt' or Carp::croak("File Open Failed");
local $/ = undef;
print scalar <$fh>;
close $fh or Carp::carp("File Close Failed");
}

我想是对“Does Perl has a PHP ReadFile Equivelant”的回应,我想我的答案是“但它并不真正需要一个”。

我使用过 PHP 的手动文件 IO 控件,它们很痛苦,相比之下,Perls 非常易于使用,以至于对一刀切的功能进行炮击似乎过头了。

另外,您可能想查看 X-SendFile支持,并且基本上向您的网络服务器发送一个 header ,告诉它要发送什么文件: http://john.guen.in/past/2007/4/17/send_files_faster_with_xsendfile/ (当然,假设它有足够的权限来访问该文件,但该文件通常不能通过标准 URI 访问)

编辑注意,最好在循环中进行,我用硬盘测试了上面的代码,它确实隐式地尝试将整个内容存储在一个不可见的临时变量中并吃掉所有的内存。

替代使用块

以下改进的代码以 8192 个字符的块读取给定文件,这将提高内存效率,并获得与我的磁盘原始读取率相当的吞吐量。 (我还把它指向/dev/full 以示好笑,并获得了健康的 500mb/s 吞吐量,而且它并没有吃掉我所有的公羊,所以一定很好)
{ 
open my $fh , '<', '/dev/sda' ;
local $/ = \8192; # this tells IO to use 8192 char chunks.
print $_ while defined ( $_ = scalar <$fh> );
close $fh;
}

应用 jrockways 建议
{ 
open my $fh , '<', '/dev/sda5' ;
print $_ while ( sysread $fh, $_ , 8192 );
close $fh;
}

这实际上使性能翻了一番,......在某些情况下,比 DD 为 O_o 提供了更好的吞吐量。

关于perl - 如何使用 Perl 提供大文件以供下载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/571744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com