避免在刷新时上传图像


Avoiding image upload on a refresh

我正在使用最简单的图像上传形式,我非常想保持这种方式,只用一些 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"时,图像已上传两次/三次/等。

如何在不破坏上传另一张图像的选项的情况下避免这种情况?

首先:

请停止使用古老的mysql_*函数编写新代码。它们不再维护,社区已开始弃用过程。相反,您应该了解预准备语句并使用PDO或MySQLi。如果您无法决定,本文将帮助您选择。如果你想学习,这里有一个非常好的PDO相关教程。

现在解决您的问题:

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

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

首先检查 db 中$image的值,只有当它不存在时,上传/插入

如果您不希望表中没有重复的文件(这是建议的),请创建文件的 md5 哈希并将其与文件一起存储在一列中,并使 md5 列唯一。

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

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

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