在我所有的 Windows 服务器上,除了一台机器,当我执行以下代码来分配一个临时文件夹时:
use CGI;
my $tmpfile = new CGITempFile(1);
print "tmpfile='", $tmpfile->as_string(), "'\n";
变量$tmpfile
被赋值'.\CGItemp1'
,这就是我想要的。但在我的一台服务器上,它被错误地设置为C:\temp\CGItemp1
.
所有服务器都运行 Windows 2003 标准版、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
在 registry keyHKEY_USERS/.DEFAULT/Environment
中,两台服务器都有:
%USERPROFILE%\Local Settings\Temp
ActiveState 的实现CGITempFile()
显然使用了一种替代机制来确定它应该如何生成临时文件夹。
真正的问题在于CGI.pm
模块和附件处理。每当将文件上传到站点时,都CGI.pm
需要将其临时存储在某个地方。为此,CGITempFile()
在内部调用CGI.pm
以分配一个临时文件夹。所以不幸的是我不能使用File::Temp
. 不管怎么说,还是要谢谢你。
这帮助了很多人。我之前确实快速浏览了CGI.pm
源代码,但您的建议让我回过头来更加认真地查看它以了解底层算法。我得到了工作,但最奇怪的是服务器上最初没有c:\temp
文件夹。
为了获得临时修复,我创建了一个c:\temp
文件夹并为网站的匿名用户帐户设置了相关权限。但是因为这是一个共享框,所以即使临时文件正在被删除,我也不能那样做。长话短说,我将c:\temp
文件夹重命名为不同的名称,并且神奇地返回了正确的 ' .\
' 文件夹路径。我还注意到客户在网站上启用了 FrontPage 扩展,这会删除网站文件夹上匿名用户帐户的写入权限,因此需要重新申请此权限。我仍然不知道为什么在这个问题开始时CGITempFile()
正在返回c:\temp
,即使该文件夹不存在,以及为什么它神奇地再次开始工作。