在我的所有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文件夹从其中一个工作服务器复制到了这台机器,但没有任何乐趣。
我检查了“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实现显然正在使用另一种机制来确定它应该如何生成临时文件夹。
真正的问题在于CGI.pm
模块和附件处理。每当文件上传到网站时CGI.pm
需要临时存储它。为此,在CGITempFile()
内调用CGI.pm
来分配临时文件夹。所以不幸的是我无法使用File::Temp
。不管怎样,谢谢。
这帮了很多。我之前确实快速浏览了CGI.pm
来源,但是你的建议让我回过头来仔细研究它以了解基础算法。我把事情搞定了,但最奇怪的是服务器上最初没有c:\temp
文件夹。
要获得临时修复,我创建了一个c:\temp
文件夹,并为该网站的匿名用户帐户设置了相关权限。但是因为这是一个共享的盒子,我不能这样做,即使临时文件被删除了。简而言之,我将c:\temp
文件夹重命名为不同的内容,并且奇怪地返回了正确的“.\
”文件夹路径。我还注意到客户在网站上启用了FrontPage扩展,这删除了网站文件夹上匿名用户帐户的写访问权限,因此需要重新申请此权限。我仍然不知道为什么在这个问题开始时CGITempFile()
正在返回c:\temp
,即使该文件夹不存在,以及为什么它神奇地再次开始工作。
答案 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 /环境