在我所有的 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
时,都需要将其临时存储在某个地方。为此,在 CGI.pm
中调用 CGITempFile()
以分配一个临时文件夹。很遗憾,我无法使用 File::Temp
。无论如何谢谢。
这帮了很多忙。我之前确实快速浏览了 CGI.pm
源代码,但您的建议让我回过头来更仔细地查看它以了解底层算法。我开始工作了,但最奇怪的是服务器上最初没有 c:\temp
文件夹。
为了获得临时修复,我创建了一个 c:\temp
文件夹,并为该网站的匿名用户帐户设置了相关权限。但是因为这是一个共享框,所以我不能这样,即使临时文件被删除了。长话短说,我将 c:\temp
文件夹重命名为不同的名称,并且神奇地返回了正确的“.\
”文件夹路径。我还注意到客户在网站上启用了 FrontPage 扩展,这会删除匿名用户帐户对网站文件夹的写入权限,因此需要重新申请此权限。我仍然不知道为什么在这个问题开始时 CGITempFile()
返回 c:\temp
,即使该文件夹不存在,并且为什么它又神奇地开始工作了。
最佳答案
临时目录的名称保存在 $CGITempFile::TMPDIRECTORY
中,并在 CGI.pm 的 find_tempdir
函数中初始化。
选择临时目录的算法在 CGI.pm 文档中有描述(搜索 -private_tempfiles)。
IIUC,如果服务器上存在 C:\Temp 文件夹,CGI.pm 将使用它。如果在 find_tempdir
中检查的目录都不存在,则当前目录“。”被使用。
希望对您有所帮助。
关于perl - CGI.pm 通常在哪里创建临时文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/86175/