【问题标题】:Avoiding image upload on a refresh避免在刷新时上传图片
【发布时间】:2012-05-22 21:09:06
【问题描述】:

我正在使用最简单的图像上传形式,我非常希望保持这种方式,只需要一些 php。

代码如下所示

<form action="index.php" method="POST" enctype="multipart/form-data">
<input type="file" name="image">
<input type="submit" value="Upload image">
</form>

<?php
$image = addslashes(file_get_contents($_FILES['image'][tmp_name]));
mysql_query("INSERT INTO store_images VALUES ('','$image')");
?>

我选择一张图片,上传并点击刷新一次/两次。当我查看“store_images”表时,图像已上传两次/三次/等等。

如何避免这种情况,而又不破坏上传另一张图片的选项?

【问题讨论】:

  • 上传后重定向到表单页面或其他页面以阻止用户重新提交表单。

标签: php forms file-upload


【解决方案1】:

开始:

请停止使用古老的 mysql_* 函数编写新代码。它们不再维护,社区已经开始 deprecation process 。相反,您应该了解prepared statements 并使用PDOMySQLi。如果您无法决定,this article 将帮助您选择。如果你想学习,here is a quite good PDO-related tutorial

现在解决您的问题:

您应该在成功上传图片header('Location: http://example.com/the/address') 后进行重定向。这甚至可以是同一页。因为您进行了重定向,所以数据不再出现在页面上,也不会再次插入。

【讨论】:

    【解决方案2】:

    使用表单生成一个随机数、散列或类似内容,并将其与您的图像一起插入到数据库中。在插入之前检查数据库中的现有哈希。

    【讨论】:

    • 虽然 OP 绝对应该设计应用程序,以便如果用户重新发布图像,它不会被第二次存储,如果 UI 也重定向浏览器以便图像更好一开始就没有转发。
    • +1 因为我的表单处理程序在某些内容被回显之后才会触发,所以我不能按照接受的答案的指示使用header。因此,除非我想做 UGLY JS 重定向,否则我无法按照上述评论进行重定向。
    【解决方案3】:

    首先在 db 中检查 $image 的值,如果它不存在,则上传/插入

    【讨论】:

      【解决方案4】:

      如果您希望表中没有文件重复(建议这样做),则创建一个 md5 hash of the file 并将其与文件一起存储在一个列中,并使 md5 列唯一。

      如果您确实希望在表中重复文件,则执行与上述完全相同的操作,仅使 md5 列和文件名唯一。这应该允许不同的用户以不同的名称再次插入相同的图片。

      如果您希望允许具有相同名称的文件重复,请按照@jimpic 的建议进行操作。这应该允许您或任何其他用户插入具有相同文件名的同一文件的副本,但前提是您是故意这样做的。

      不要在每次插入后重定向到另一个页面。如果可以的话,最好不要停止正常的浏览器后退/前进功能。对用户来说,感觉就像一页刷新,而实际上对浏览器来说,他们的行为就像 2 并且惹恼了人们,因为后退按钮会询问“你想重新发送表单数据”。

      【讨论】:

      • 嗯? “因为后退按钮会询问“您要重新发送表单数据吗”。”这正是您进行重定向的原因。为了防止它......
      • 您执行重定向以防止 刷新 按钮重新插入新数据。但是现在 back 按钮将重新插入。天才不是吗?逃避问题而不是解决问题。
      • 最好的最可靠和通用的解决方案是将随机哈希存储在表的列中并与表单一起传递。
      • 我的其他解决方案比较死板,需要您确保应用程序的需求不能超出正常用例。
      • 如果您在使用随机哈希或 md5 时尝试重新插入,但由于唯一限制而失败,您可以向用户显示合理的错误消息。
      猜你喜欢
      • 1970-01-01
      • 2013-10-18
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      • 2022-10-08
      • 2015-05-29
      • 1970-01-01
      • 2021-03-23
      相关资源
      最近更新 更多