首页 > 解决方案 > 为什么 http 上传时没有创建 //Windows/Temp 临时文件?

问题描述

我正在 Windows 10(当前)、Apache/2.4.39 (Win64)、mod_perl/2.0.10 和 Perl/v5.26.3 平台上开发应用程序。语言集是 dHTML(html、css、JavaScript、Perl 和 C。

我执行 http(来自 Perl)上传并获取应该在服务器上 //Windows/Temp 目录中创建的临时文件名,如下所示。

$upload_filehandle = $page->upload('filex'); # File handle to uploaded file.
my $tmpfilename = $page->tmpFileName( $upload_filehandle );

上传文件句柄是在没有客户端目录的情况下要上传的客户端文件的正确名称(在我测试的 6 个浏览器中为真)。第二行返回一个字符串,该字符串看起来像 //Windows/Temp 目录中其他临时文件的名称。临时文件在 //Windows/Temp 目录中创建,内容正确。我知道这一点,因为我制作了一个不同名称的副本。

但是临时文件内容不会加载到目标文件中。目标文件在正确的位置具有正确的名称和正确的日期/时间,但字节数为零。

我在 Apache 日志文件中没有收到任何错误,也没有控制台消息,并且我正在使用“使用诊断;”运行。调试器总是有一个每次都不同的 glob 语句( GLOB(0x2a0cc0d06c0) ),它是在上传循环之后生成的。再一次,在正确的位置创建了一个具有正确名称和正确日期/时间的文件,但字节数为零。

接下来是到服务器目标文件的写循环。$filex 文件名是正确的。$upload_filehandle 是没有目录的客户端文件的名称,它使用 tmpFileName(上图)转换为服务器上的 //Windows/Temp 目录中的临时文件,该目录具有正确的内容。但内容不会传输到目标文件。

open(my $UF_fh,'>',$filex) || croak "Couldn't open file $filex, $!"; # Server file to upload to.     

if (index(lc($thefn),'.gif') > -1) {
  binmode($UF_fh); # Set file output to binary mode if image.
}       

while ( <$upload_filehandle> )  {      
  print $UF_fh; # Write it out.
}

close $UF_fh;

任何帮助表示赞赏。谢谢。

ct

标签: perluploaddhtml

解决方案


一个似乎有效的答案,但不是它应该工作的方式。我有临时文件的完全限定名称,所以我将它复制到目标文件。副本不需要 binmode() 工作。它确实有效,但我仍然希望了解如何使其应该如何工作。ct


推荐阅读