【问题标题】:Why CGI.pm upload old revision of a file on successful new file upload?为什么 CGI.pm 在新文件上传成功时上传文件的旧版本?
【发布时间】:2011-04-16 06:37:29
【问题描述】:

我正在使用CGI.pm 版本 3.10 使用 Perl 进行文件上传。我有一个上传文件的 Perl 脚本,我的一个应用程序使用签入签出功能跟踪上传文档的不同修订。

再创作步骤:

  • 我已经使用我的应用程序(基于 Web 使用 apache)完成了结帐(下载文件)。
  • 退出当前用户会话。
  • 使用相同的凭据再次登录,然后签入(上传)新文件。

输出:

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

输出是正确的和预期的,除了一种情况是问题

问题:

  • 新上传的文件内容与数据库中上次上传的修订内容一致。

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

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

【问题讨论】:

  • 您应该尝试在某些日志中跟踪文件的内容。你会看到它在哪一步改变了它不应该改变的方式。使用您提供的信息很难理解发生了什么。这水平太高了。请尝试本地化错误并附上导致它的代码。
  • 你必须展示一些代码。构建一个展示问题的最小测试用例,以便其他人可以自己重现它。
  • 很难理解你的问题。您从数据库中获取文件的最新版本,下载它,在本地修改并重新上传。在那里它被上传到一个临时文件夹。当您尝试将其与数据库加载(或比较?)时,您会意识到临时文件现在具有数据库中文件的内容。这是正确的吗 ?如果是这样,我的猜测是您检查数据库的代码会获取该数据库中的文件并用它替换临时文件。但是根据您的高级描述,很难说出原因。正如 Ivan 建议的那样,您应该在流程的各个步骤中检查您的文件以进行调试。
  • 开始正常的调试过程。检查每个步骤的数据,看看发生了什么。
  • 感谢所有建议。我将调试并分享结果.. 只是想检查一下 CGI.pm 3.10 是否太旧而无法在 2010 年使用,我应该转向新版本吗?

标签: perl upload cgi


【解决方案1】:

我发现了问题。原因是复制文件的目标路径不正确,这是因为我的应用程序之一事件将复制文件的路径映射到不同的目录,并且该路径存储在用户会话中。仅当我在启动上传脚本之前运行事件时才会发生这种情况。这就是它难以捕捉的原因。由于上传脚本旨在从同一路径中选择新复制的文件,因此它总是最终将同一文件上传到数据库中并带有另一个修订版。新复制的文件位于新路径中。

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

谢谢

【讨论】:

    【解决方案2】:

    听起来您将旧文件名卡在文件上传字段中。不确定文件字段是否会发生这种情况,但这是其他字段类型的功能。

    尝试添加 -nosticky 杂注,例如,use CGI qw(-nosticky :all);。另一个可以尝试的 pragma 是 -private_tempfiles,它应该可以防止用户“窃听”他们自己的上传内容。

    当然,您可能需要本地化 (my) 某些变量或将 -force 添加到文件字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-12
      • 2011-07-09
      • 2020-07-14
      • 1970-01-01
      • 2015-12-08
      • 1970-01-01
      相关资源
      最近更新 更多