【问题标题】:Firefox Upload Form IssueFirefox 上传表单问题
【发布时间】:2011-01-21 19:35:35
【问题描述】:

我在 php 中创建了一个上传脚本,它接收一个文件,调整它的大小,并创建一个裁剪的方形缩略图。脚本本身似乎工作正常。

但是,当我尝试通过 Firefox 上传图像时,单击提交按钮时,浏览器会显示加载动画,但它从不调用脚本,它只是停留在当前页面上。如果不上传图片,则可以找到并运行脚本。

我在 safari 中尝试过,但没有遇到同样的问题,我可以从表单上传图片,它会处理并带我进入正确的页面。

我已经厌倦了从表单中调用一个基本脚本,它只是打印出 $_POST 和 $_FILES,我得到相同的结果,如果存在图像,它不会进入脚本,如果没有图像,它运行良好。

我只是想知道是否有人知道发生了什么?


=更新=

好的,所以我仍然遇到这个问题,我似乎认为我已经找到了导致它的原因,但后来我发现了完全矛盾的东西。

目前,我注意到我清除了我的Firefox缓存后可以成功上传,但是我只能上传一张图片,然后当我尝试上传另一张时,我不能,它只是重置连接后“加载中……”一会儿。

另外,我注意到我可以按几次 Ctrl+F5 并通过另一个上传。

虽然有一些方法可以解决这个问题,但我不希望有一个表单要求用户在每次需要上传时清除 cookie 或刷新。而且正如我之前提到的,这个错误不会发生在 IE/Opera/Safari/Chrome 中。

似乎 Firefox 正在存储一些东西,我不确定是什么。 任何帮助将不胜感激。

如果有帮助,这里是我正在使用的代码。

HTML 表单

<form enctype="multipart/form-data" action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="POST">
<label for="file">Choose a file to upload</label>
<input id="file" name="file" type="file" /><br />
<input type="submit" value="Upload File" name="submit" />

还有 PHP:

if (isset($_POST['submit'])) {

  echo "Processing...<br/>";

  if (isset($_FILES['file']['name'])) {
      $file_array = $_FILES['file'];

      echo "Uploading...";
      upload File($file_array);
      echo "...Done";

  }
}

回声是让我看看发生了什么。如果它们都没有实际输出。所以由于某种原因,表格没有被提交。这就是为什么它没有进入脚本。我不知道为什么。我没有 CSS 或 JavaScript 错误。

== 更新 ==

好的,我正在尝试更多的东西,但仍然没有运气,HTML、CSS 和 JavaScript 都是有效的。我已经完成了 IIS 重置,我已经重新创建了我的 Firefox 配置文件。现在还是运气。

我又试了一次,这次我在加载过程中(连接重置之前)停止了,然后尝试转到网站的其他页面,继续冻结,它仍然会说“正在加载...”和“等待本地主机...”。不太确定该怎么做,是我有一些设置吗?但是为什么不影响其他浏览器呢?

== 更新 ==

正如我在下面提到的,似乎是 AVG Linkscanner/Active surf shield 导致了这个问题,并且有很多报告称其他人也有类似的问题。我从 AVG Free v9.0.733 更新到 v9.0.790,但我仍然遇到同样的问题。我将浏览 AVG 支持论坛,可能会在那里发布一些内容,因为这似乎是一个 AVG 问题。

如果有人有更多见解,请在下面发布。非常感谢:)

【问题讨论】:

  • 如果您希望我们查看脚本,请发布脚本。
  • 就是这样,它甚至没有调用脚本句号。即使我将表单设置为将数据发送到上面提到的简单脚本,它也不会。
  • 按 CTRL+SHIFT+J 打开 Firefox 控制台并检查是否有任何错误消息?
  • 仍然没有运气,我检查了控制台是否有错误,一些 js 错误但即使不包括 js 我也遇到了同样的问题。上传在 IE、Safari、Opera 和 Chrome 中正常工作。
  • 我什至尝试过发布到一个回显“你好”的脚本。再一次,如果我发送图像,它不会去任何地方。 :(

标签: php firefox forms timeout enctype


【解决方案1】:

好的,我在这方面有所了解,您可能认为这只是一个愚蠢的错误,但请继续阅读。

如果我没有 ..etc 标签而只有..

<form enctype="multipart/form-data" action="up.php" method="POST">
    <label for="file">Choose a file to upload</label>
    <input id="file" name="file" type="file" /><br />
    <input type="submit" value="Upload File" name="submit" />
</form>

然后我在提交表单时遇到了这个问题,firefox 会挂起。

如果我有正确的标签,比如..

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 


<head>
<title></title>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>

<body >

    <form enctype="multipart/form-data" action="up.php" method="POST">
    <label for="file">Choose a file to upload</label>
    <input id="file" name="file" type="file" /><br />
    <input type="submit" value="Upload File" name="submit" />
    </form>

</body>

</html>

那么看来这行得通。现在这看起来很简单,但是我动态构建了我的页面,所以我只有一个文件,其中只包含页面中包含的表单代码。

据我所知,尽管将表单代码放在单独的文件中应该没有什么区别,因为它都放在了服务器端。

【讨论】:

  • 大声笑我在 1 天前就遇到了这个问题,我才意识到我的问题是 Firefox,因为在 Chrome 中上传工作正常,我可以在右下角看到进度。我想知道是否有任何插件可以显示 Firefox 上传的进度条。
【解决方案2】:

有时,相对路径被不同的浏览器感知不同,实际上并不确定,但尝试通过在路径前加上./来指定当前目录,例如:

$target_path = "./public/photos/";

其余代码对我来说看起来不错。

【讨论】:

  • 感谢您的帮助,但这个过程还没有走到这一步。无论如何,我进行了更改,并进行了测试,但没有运气。我从localhost/upload/index.php 调用它,表单已设置为将数据发送到同一目录中的upload.php。如果选择了图像,当我单击提交时,它只会挂在 index.php 上,并且加载动画会继续。我不知道为什么。
  • @cast01: 确保你对目录 chmod 有写权限到 755
  • 再次感谢,但仍然没有运气。我完全被难住了。
【解决方案3】:

以防万一您使用的是最新的 FF 3.6,我遇到了完全相同的问题,任何加载大文件的表单(1MB 就足够了)似乎会阻止 FF 上传。 在 IE7/Safari/Opera 上它可以工作。

【讨论】:

  • 嘿,谢谢,最初我以为这可能是我的 FF 版本,但我仍在使用 3.5,上传内容各不相同,大多数只有 200-300KB。
【解决方案4】:

然后,当您在 FF 中右键单击并查看源代码时,它应该看起来与上面代码中的完全一样(在“如果我有正确的标签,如..”下方)。

【讨论】:

  • 是的,在页面源代码中看起来一切正常。页面构造正确。
  • 如果你愿意,你可以发布它,只是为了确保。
【解决方案5】:

来自xhtml 1.0 specification

HTML 4 定义了 name 属性 元素 a、applet、form、frame、 iframe、img 和地图。 HTML 4 也 引入了 id 属性。两者的 这些属性被设计为 用作片段标识符。

在 XML 中,片段标识符是 类型 ID,并且只能有一个 每个类型 ID 的单个属性 元素。因此,在 XHTML 1.0 id 属性被定义为类型 ID。为了确保 XHTML 1.0 文档是结构良好的 XML 文档,XHTML 1.0 文档必须 定义时使用 id 属性 元素上的片段标识符 上面列出的。

也许将id 添加到form 可以解决您的问题。

【讨论】:

  • 您好,我接受了您的建议并在表单标签中添加了一个 id="myform",但我仍然得到相同的行为。我认为它仍然可能是验证,因为我弄乱了不同的文档类型,有一次我把它当作过渡,问题发生得更频繁。 (但我不知道它们是相关问题还是只是现阶段的巧合。
  • 正如我上面所说的(在 OP 中),尝试使用不符合 xhtml 的“标准”html,看看它是否会触发您的 php 脚本
  • 好的,我已经将 doctype 更改为 transitional,通过验证器运行它并有效,我的 web 开发人员工具栏也没有显示 html/css/js 错误。这个问题似乎发生的频率较低,但还不足以让我打折扣。
  • 刚看到你的评论,我现在试试标准:)
  • 好主意,我试过了,并且调用了 from,虽然 iamge 只是没有通过。我想我已经在我的工作站中找到了守护进程....AVG Linkscanner。我禁用了它,上传似乎正在通过。但是我不想禁用它,或者告诉用户禁用它来上传文件。
【解决方案6】:

if (isset($_POST['submit'])) { 可能有问题,而变量 $_POST['submit'] 不包含在 FireFox 中?

<pre>
    <?PHP
        print_r($_POST);
    ?>
</pre>

【讨论】:

  • 好主意,但我已经对 $_POST 值进行了 print_r。在 frirefox 没有重置连接的情况下,它们会被正确打印出来。但是,当它确实重置时,脚本甚至无法看到实际发布的内容。表单已提交,但介于两者之间。
【解决方案7】:

这对您没有多大帮助,但我遇到了完全相同的问题。我什至重新安装了 FF,清除了缓存,直接剥离了代码(变成了一个非常简单的形式,没有经过验证,并且所有 PHP 都被剥离了——无论是在加载时还是在回发时)。我在 FF 3.6.13 中遇到了问题,并且已经针对当前版本的 Safari(win)、Chrome、Opera 和 IE 进行了测试,其中代码都可以完美运行。我的代码验证为严格的 XHTML,并且上面的所有建议都已经存在...而且我正在使用我的本地(在同一台计算机上)网站。

很多感谢您将我指向 AVG Link 扫描仪...禁用它确实可以解决问题,但这仍然让我认为 FF 存在错误,因为“所有”其他浏览器都可以很好地使用 AVG Link扫描仪开启。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-02
    • 2014-10-19
    • 2015-02-17
    • 2021-09-26
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多