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

标签 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 时,都需要将其临时存储在某个地方。为此,在 CGI.pm 中调用 CGITempFile() 以分配一个临时文件夹。很遗憾,我无法使用 File::Temp。无论如何谢谢。

@Chris:

这帮了很多忙。我之前确实快速浏览了 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/

相关文章:

perl - Firefox 不删除过期的 Perl CGI::Cookie cookie

cgi - #include virtual in .html 文件

regex - TCL 中括号之间的非贪婪捕获 : #\( . *?\)

linux - Perl 编译,libgdbm 不兼容

perl - Perl 如何验证一个路径是一个目录,但又不能同时调用 opendir() 呢?

Perl 不继承基本方法

cgi - 内部服务器错误 500 Bugzilla 安装

perl - 使用 ActivePerl 读取二进制文件时出现问题?

perl - 当 stdin/stderr/stdout 在 Activestate Perl 中重定向时写入控制台

perl - 我可以在 Perl 的反引号中执行多行命令吗?