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

时间:2008-09-17 18:31:38

标签: perl cgi activestate

在我的所有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\1

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

  

c:\windows\temp

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

  

%USERPROFILE%\Local Settings\Temp

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

@Ranguard:

真正的问题在于CGI.pm模块和附件处理。每当文件上传到网站时CGI.pm需要临时存储它。为此,在CGITempFile()内调用CGI.pm来分配临时文件夹。所以不幸的是我无法使用File::Temp。不管怎样,谢谢。

@Chris:

这帮了很多。我之前确实快速浏览了CGI.pm来源,但是你的建议让我回过头来仔细研究它以了解基础算法。我把事情搞定了,但最奇怪的是服务器上最初没有c:\temp文件夹。

要获得临时修复,我创建了一个c:\temp文件夹,并为该网站的匿名用户帐户设置了相关权限。但是因为这是一个共享的盒子,我不能这样做,即使临时文件被删除了。简而言之,我将c:\temp文件夹重命名为不同的内容,并且奇怪地返回了正确的“.\”文件夹路径。我还注意到客户在网站上启用了FrontPage扩展,这删除了网站文件夹上匿名用户帐户的写访问权限,因此需要重新申请此权限。我仍然不知道为什么在这个问题开始时CGITempFile()正在返回c:\temp,即使该文件夹不存在,以及为什么它神奇地再次开始工作。

3 个答案:

答案 0 :(得分:8)

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

我希望这会有所帮助。

答案 1 :(得分:2)

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

它专门设计用于任何操作系统。

答案 2 :(得分:1)

如果您正在运行此脚本,请检查%TEMP%环境变量以查看它是否不同。

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