CGI.pm通常在哪里创建临时文件?

时间:2020-03-05 18:59:37  来源:igfitidea点击:

在我的所有Windows服务器上(一台机器除外),当我执行以下代码来分配一个临时文件文件夹时:

use CGI;
my $tmpfile = new CGITempFile(1);
print "tmpfile='", $tmpfile->as_string(), "'\n";

变量$ tmpfile分配了值'。\ CGItemp1',这就是我想要的。但是在我的一台服务器上,它错误地设置为C:\ temp \ CGItemp1

所有服务器都运行Windows 2003 Standard Edition,IIS6和ActivePerl 5.8.8.822(不可以选择升级到更高版本的Perl)。从命令行或者在IIS中作为CGI脚本运行脚本时,结果始终是相同的(其中scriptmap.pl=c:\ perl \ bin \ perl.exe"%s"%s)。

如何修复此Perl安装并强制其默认返回'。\ CGItemp1`?

我什至将整个Perl文件夹从其中一台工作的服务器复制到了这台机器上,但是没有任何乐趣。

@Hometoast:

我检查了"TMP"和"TEMP"环境变量以及" $ ENV {TMP}"和" $ ENV {TEMP}",它们是相同的。

他们从命令行指向用户配置文件目录,例如:

C:\DOCUME~1\[USERNAME]\LOCALS~1\Temp

在IIS下作为CGI脚本运行时,它们都指向:

c:\windows\temp

在注册表项" HKEY_USERS / .DEFAULT / Environment"中,两个服务器都具有:

%USERPROFILE%\Local Settings\Temp

CGITempFile()的ActiveState实现显然使用一种替代机制来确定应如何生成临时文件夹。

@Ranguard:

真正的问题在于CGI.pm模块和附件处理。每当文件上传到站点" CGI.pm"时,都需要将其存储在临时位置。为此,在CGI.pm内调用CGITempFile()来分配一个临时文件夹。所以不幸的是我不能使用File :: Temp。不管怎么说,还是要谢谢你。

@克里斯:

那帮了一大堆。之前我确实对CGI.pm源进行了快速扫描,但是建议使我回过头来更加认真地研究它以了解底层算法。我的工作正常,但最奇怪的是服务器上最初没有c:\ temp文件夹。

为了获得临时修复,我创建了一个c:\ temp文件夹,并为网站的匿名用户帐户设置了相关权限。但是因为这是一个共享框,所以即使删除了临时文件,我也不能那样做。长话短说,我将c:\ temp文件夹重命名为其他名称,并且神奇地返回了正确的'.. \'文件夹路径。我还注意到该客户已在站点上启用FrontPage扩展,从而删除了网站文件夹上匿名用户帐户的写访问权限,因此需要重新应用此权限。我仍然茫然不解,为什么在这个问题开始时CGITempFile()返回c:\ temp`,即使该文件夹不存在,以及为什么它神奇地重新开始工作。

解决方案

回答

如果我们以自己的身份运行此脚本,请检查%TEMP%环境变量以查看其是否不同。

如果IIS正在执行,请检查注册表中TMP和TEMP的值,在下面
HKEY_USERS / .DEFAULT /环境

回答

临时目录的名称保存在$ CGITempFile :: TMPDIRECTORY中,并在CGI.pm的find_tempdir函数中进行初始化。
CGI.pm文档(搜索-private_tempfiles)中描述了用于选择临时目录的算法。
IIUC,如果服务器上存在C:\ Temp文件夹,则CGI.pm将使用它。如果在" find_tempdir"中检查的目录都不存在,则当前目录为""。用来。

我希望这有帮助。

回答

不是我们问题的直接答案,但是我们是否尝试过使用File :: Temp?

它是专门为在任何OS上运行而设计的。