HTTP 下载显示字幕而不是进度条

问题描述 投票:0回答:1

这是多年来用于通过 http 下载文件的 perl 脚本的一部分。现在它仍然下载文件,但 http 客户端似乎无法读取 Content-length 字段(已测试 chrome、edge 或 firefox);所以进度条正在做选取框而不是进度。

$file = "$ENV{DOCUMENT_ROOT}$dir/$arch";
$len = -s $file;
print "Content-Type:application/octet-stream\n";
print "Content-Disposition:attachment;filename=$arch\n";
print "Content-Length:$len\n\n";
open FILE, "< $file" or Error('Cannot read '.$arch);
binmode FILE;
local $/ = \32768;
while (<FILE>){
    print $_;
};
close FILE;

有人知道为什么这种行为会改变吗?

perl
1个回答
0
投票

不是答案,只是猜测,除非它被原始海报打上绿色勾号:

我假设的上下文是我们正在讨论遗留的 CGI Perl 脚本。它用于下载可能很大的平台特定文件 (

$arch
)。 如果这些文件的大小超过 2 GiB(或者是 4 GiB?抱歉,我现在无法检查),由于数字溢出,通过
Content-Length
变量报告的
$len
标头可能具有负值。我再次猜测用户代理可能会忽略负的
Content-Length
标头,这就是为什么原始发布者在用户代理中看到的是选取框而不是百分比进度指示。

题外话:您是否验证

$dir
$arch
符合您的期望,特别是它们不包含任何
../
序列?否则,选框不是你的问题。您应该担心人们可以通过修改 URL 参数从您的 Web 服务器下载任意文件。

© www.soinside.com 2019 - 2024. All rights reserved.