CGI.pm通常在哪里创建临时文件?
在我的所有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上运行而设计的。