6

需要一些可以从服务器机器下载文件的 cgi-perl 脚本。EX:单击下载链接,它将打开一个“另存为”窗口,并允许我将文件保存在本地计算机上。

我已经使用 CGI 创建了一个网页,使用它我会将文件上传到服务器并运行 perl 脚本将其转换为其他格式(直到我完成)。现在我需要将此文件取回(下载回)到系统。

#!/usr/bin/perl
#print "Content-type: text/html\n\n";
my $filepath='/upload/testing.pm';

    print "Content-Type: text/html\n\n";

    open("DOWNLOADFILE", "<".$filePath);
    while($fileContents = <DOWNLOADFILE>) {
        print $fileContents;
    }
print "Content-Type: text\n";
print "Content-Disposition: attachment; filename='testing.pm'\n";
print "Content-Description: File to download\n\n";
    close DOWNLOADFILE;

将文件从我的机器(客户端)上传到服务器机器,在那里我有一个 perl 脚本,它将文件转换为另一种格式并将新转换的文件保存到目录 ex: /upload-> 直到这里我完成了脚本.

现在我需要使用浏览器将此文件下载回客户端计算机。在这种情况下,我试图将 testing.pm 文件下载回客户端机器。

4

2 回答 2

5

重新排列 HTML 标头有效。这是工作脚本。可以按原样使用它

use CGI;
my $html= new CGI;
#get the file name from URL ex. http://<server_IP>/cgi-bin/download.cgi?a=testing.txt
my $file= $html->param('a'); 
# $file is nothing but testing.txt
my $filepath= "/var/www/upload/$file";

print ("Content-Type:application/x-download\n");
print "Content-Disposition: attachment; filename=$file\n\n";

open FILE, "< $filepath" or die "can't open : $!";
binmode FILE;
local $/ = \10240;
while (<FILE>){
    print $_;
}

    close FILE;
 # use Unlink if u want to delete the files after download.
#unlink ($filepath);
于 2013-03-11T15:32:31.927 回答
4

我认为您刚刚拼错了您的内容处置标题。它应该是“附件”,而不是“附件”。

更新(下面的评论):

好的,进一步看,我看到您正在打印 CGI 标头(内容类型:文本/html),然后是两个换行符,然后,打印更多 CGI 标头并期望浏览器注意到它们。您的响应中的第一个空行将告诉浏览器标头已完成。所以你的第二批标题将被视为内容。

我还看到您在第二组标题之前打印文件的内容。这将使它们成为页脚而不是页眉:-)

您需要重新排序代码,以便只返回一组标头。然后你返回数据。

于 2013-03-08T14:27:10.263 回答