我有一个包含图片上传和输入文本框的表单。用户将能够上传图像并输入文本而无需使用Ajax刷新页面。图像将被中继到PHP,PHP将处理如何处理图像。我的问题是,用户第一次上传图像时,将检查服务器上是否有相同的图像名称。如果是,则图像名称将获得uniqid(),然后将上载。但是,如果用户更改文本框字段中的数据,但保留图像呢?然后使用uniqid()再次上传该图像,因为它已经在服务器上。我尝试使用我当前的图像处理代码来解决这个问题:
PHP
$target_file = $_SERVER['DOCUMENT_ROOT'] . "/stories/media/images/$name";
if (isset($_SESSION["size"]))
{
$prevSize = $_SESSION["size"];
if (filesize($prevSize) != filesize($size))
{
if (@getimagesize($target_file) == true)
{
$ext = pathinfo($name, PATHINFO_EXTENSION);
$name = basename($name, "." . $ext);
$name = $name . uniqid() . "." . $ext;
$target_file = $_SERVER['DOCUMENT_ROOT'] . "/stories/media/images/$name";
}
}
}
else
{
$_SESSION["size"] = $size;
if (@getimagesize($target_file) == true)
{
$ext = pathinfo($name, PATHINFO_EXTENSION);
$name = basename($name, "." . $ext);
$name = $name . uniqid() . "." . $ext;
$target_file = $_SERVER['DOCUMENT_ROOT'] . "/stories/media/images/$name";
}
}
move_uploaded_file($tempName, $target_file);
不幸的是,这段代码不能像我想要的那样工作。如果我连续两次上传相同的图像,则在同一会话中,它不会覆盖我之前的图像。相反,它将它放在具有uniqid名称的服务器上。我究竟做错了什么?如果有更好的解决方法,我很想知道!
答案 0 :(得分:0)
您可以做的是每当有人上传图像,存储图像的哈希值,加密图像并将其存储在图像行的数据库中。
从现在开始,每当有人上传图片时都会运行如下查询:
SELECT COUNT(*) FROM images WHERE hash = $hash
然后在if语句中检查返回的值是否大于0,如果是,则执行您需要执行的操作而不重新上载图像,如果为0,则上传图像并继续< / p>
答案 1 :(得分:0)
我为此示例选择了用户头像上传。我不确定您的图像是什么,但工作流程应该类似。不会将重复的头像复制到图像路径。
function get_avatar_filename($filename) {
// only generate an avatar filename if the mimetype matches
switch (mime_content_type($filename)) {
case 'image/jpeg':
return sprintf('%s.jpg', hash_file('md5', $filename));
case 'image/gif':
return sprintf('%s.gif', hash_file('md5', $filename));
case 'image/png':
return sprintf('%s.png', hash_file('md5', $filename));
// otherwise the user uploaded a non-supported image
// return the default image
default:
return 'default-avatar.jpg';
}
}
function upload_avatar($avatarPath, $filename) {
// get the avatar filename
$f = get_avatar_filename($filename);
// copy the file to $avarPath only if the file doesn't already exist
if (!file_exists("{$avatarPath}/{$f}")) {
move_uploaded_file($filename, "{$avatarPath}/{$f}");
}
// return the avatar filename
return $f;
}
现在,您可以在处理用户表单提交时使用这些功能
// process user form submission ...
// ...
$filename = upload_avatar(
$_SERVER['DOCUMENT_ROOT'] . "/stories/media/images/",
$_FILES['user_avatar']['tmp_name']
);
// save the avatar location for the user ...
// or whatever
$user->setAvatar($filename);
$user->save();
如果用户上传不受支持的图片类型,则会为他们分配default-avatar.jpg
,这是一个应存在于您的图片目录中的文件。