CGI如何让用户在下载文件之后自动删除服务器端的文件[已解决]

CGI如何让用户在下载文件之后自动删除服务器端的文件[已解决]

大家好,我现在遇到了一个问题,在服务器端用File::Temp生成了临时文件,然后通过print "Location:  \n\n"方式将页面redirect到临时文件的具体URL,这个时候用户就被提示“打开-保存-取消”文件。

我现在想要在用户下载文件之后立即删除服务器端的文件,但是实在是找不到可行并且方便的做法。

哪位做过这方面的东西,能否指点一下?

实际上File::Temp自己也有一个机制可以在scope之外自动删除临时文件,但是在print "Location:  \n\n"之后就到达了scope的结尾,文件自动删除了,等浏览器执行Location: 指令的时候,文件已经找不到了。

但是如果我规定禁止File:Temp自动删除临时文件,那么我又没有办法知道什么时候用户已经下载完临时文件,无法确定什么时候删除临时文件。

大家有没有什么更好的办法,多谢!

貌似是一个算法的问题,呵呵,你可以设置Flag嘛,用户下载完文件的时候,让用户CFM,然后就会自动删除文件啊
这当然是最理想的情况。
可是现在我使用的是Redirect的方法,下载的操作是由系统自动执行的,用户也没有办法通过点击“打开”、“保存”或者“取消”来向服务器端传递信号。

所以既然用户没有办法能够给出信号,是否有办法让系统给出信号呢。
我找到了方法。先执行下面的函数,把文件推出去,然后再执行删除文件的操作即可。不使用redirect的方法。

sub DownloadFile {

    # $filepath is the directory
    # $filename is the name of the file
    my ($filepath,$filename) = @_;

    chdir($filepath) || return(0);
    my $filesize = -s $filename;

    # print full header
    print "Content-disposition: inline; filename=$filename\n";
    print "Content-Length: $filesize\n";
    print "Content-Type: application/octet-stream\n\n";

    # open in binmode
    open(READ,$filename) || die;
    binmode READ;

    # stream it out
    binmode STDOUT;
    while (<READ>) { print;    }
    close(READ);

    # should always return true
    return(1);
}


QUOTE:
原帖由 xdwjack 于 2008-5-30 09:26 发表
我找到了方法。先执行下面的函数,把文件推出去,然后再执行删除文件的操作即可。不使用redirect的方法。

sub DownloadFile {

    # $filepath is the directory
    # $filename is the name of the fi ...

看了楼主一楼的帖子,正要给楼主说这个方法的.....