2010-09-23 65 views
1

我正在使用CGI.pm版本3.10来使用Perl进行文件上传。我有一个上传文件的Perl脚本,我的一个应用程序通过签入签出设备跟踪上传文件的不同修订版本。为什么CGI.pm上传成功的新文件上传文件的旧版本?

重新造物步骤:

  • 我已经用我的应用程序(这是基于网络的使用Apache)做了结账(下载文件)。
  • 从当前用户会话中注销。
  • 用相同的凭证重新登录,然后签入(上传)一个新文件。

输出:

  • 上传成功
  • 的Perl上传脚本显示了正确的上传数据
  • 文件的新修订创建

输出是正确的和预期之外的一个案件是问题

期:

  • 新上传的文件的内容与上次上载的数据库中的内容相同。

我正在使用临时文件夹来复制新内容,如果我在上传脚本中打印新内容,那么它就是正确的。我对CGI上传大小没有限制。它似乎在CGI环境中失败了,可能是我正在使用的版本。我不使用污点模式。

任何人都可以帮助我理解可能的原因吗?

+1

您应该尝试跟踪某些日志中文件的内容。你会看到在哪一步它改变了它不应该的方式。使用您提供的信息很难理解发生的情况。这是太高的水平。请尝试*本地化*错误并附上导致它的代码。 – 2010-09-23 13:45:14

+1

你必须显示一些代码。构建一个展示问题的最小测试用例,以便其他人可以自行复制它。 – daxim 2010-09-23 13:47:15

+1

很难理解你的问题。您从数据库中获取文件的最新版本,下载它,在本地修改并重新上传。它可以很好地上传到临时文件夹。当您尝试加载(或比较?)它与数据库时,您意识到临时文件现在具有文件在数据库中的内容。这是正确的吗 ?如果是这样,我的猜测是你的代码来检查数据库采取该数据库中的文件,并用它替换临时的。但是随着你的高级描述,很难说明原因。正如Ivan所建议的那样,您应该在流程的各个步骤检查文件以进行调试。 – 2010-09-23 16:26:05

回答

0

我发现了这个问题。原因是复制文件的目标路径不正确,这是因为我的应用程序的一个事件将复制文件的路径映射到不同的目录,并且此路径存储在用户会话中。只有当我在凝视上传脚本之前运行事件时才会发生这种情况。这是很难赶上的原因。由于上传脚本旨在从相同路径中选择新复制的文件,所以最终总会以另一个版本上传DB中的同一文件。新复制的文件位于新路径中。

通过在上载前映射正确的路径来解决。

谢谢

1

听起来就像你得到的旧文件名卡在文件上传字段。不知道这是否会发生在文件字段中,但这是其他字段类型的功能。

尝试添加-nosticky编译指示,例如,use CGI qw(-nosticky :all);。要尝试的另一个附注是-private_tempfiles,它应该防止用户甚至在自己的上传中“窃听”。

当然,这可能是因为您需要本地化(我的)某些变量或向文件字段添加-force。