【问题标题】:How to destroy the current image in image upload图片上传中如何销毁当前图片
【发布时间】:2014-07-19 08:03:55
【问题描述】:

我想做的是当用户决定更改他的个人资料图片时,数据库中的链接将被更新并将图像移动到上传文件夹并销毁该特定用户上传文件夹中的当前链接和图像。

我的代码中的问题是,当用户更改他的个人资料图片时,它会在上传文件夹中添加另一张图片。我要做的是先删除该特定用户的当前图像,然后再将他选择的新图像移至上传文件夹。

php代码

<?php
include_once('../dbc/database.php');

$db = new Connection();
$db = $db->dbConnect();
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


$email = isset($_POST['email']) ? $_POST['email'] : "";
$image = addslashes(file_get_contents($_FILES['imageInput']['tmp_name']));
$image_name = addslashes($_FILES['imageInput']['name']);
$image_size = getimagesize($_FILES['imageInput']['tmp_name']);

move_uploaded_file($_FILES["imageInput"]["tmp_name"], "../upload/" . $_FILES["imageInput"]["name"]);
$location = "elogFiles/upload/" . $_FILES["imageInput"]["name"];


$qOldpic = "SELECT user_image FROM tbl_user WHERE user_email = : email";
$queryOldpic = $db->prepare($qOldpic);
$queryOldpic->bindParam(':email', $email);
$queryOldpic->execute();
$num_rows = $queryOldpic->rowCount(); 


if ($num_rows == 1) {
    unlink($queryOldpic);
    $q = "UPDATE tbl_user SET user_image = '$location' WHERE user_email= :email ";
    $query = $db->prepare($q);
    $query->bindParam(':email', $email);
    $results = $query->execute();
    echo "1";
}


?>

【问题讨论】:

  • 切勿以客户提供的名称存储此类图像!始终根据用户 ID 创建一个内部名称以确保安全。那么你所要做的就是在目标路径上调用unlink(),然后再调用move_uploaded_file()
  • 可以使用unlink()函数删除文件。

标签: php jquery html ajax pdo


【解决方案1】:

http://php.net/manual/en/function.unlink.php

以上网址将帮助您了解删除以前图像文件的正确方法。

如果您想在给定位置不存在该文件时使错误消息不可见,请使用“@”,这样您就可以简单地忽略错误显示,如下所示:

<?php
unlink($filename);
?>

【讨论】:

  • 我尝试取消链接,但当我上传另一张图像时,图像文件仍然存在。
  • 我假设 $_POST['imageLink'] 指向当前图片(要删除)。您需要打印它是否正确包含文件的完整路径,并检查 unlink 调用的返回值。最重要的是,我认为您最好直接从数据库中调用 $_POST['imageLink'] 的值,以避免用户在 Web 表单中被利用。 (否则,您应该清理 $_POST['imageLink'] 以确保程序代码是安全的)
  • 我编辑了我的代码,现在它不会更新,你能帮我看看它有什么问题吗?
【解决方案2】:

在执行update 之前,运行select 并通过email 获取user_image,将其存储到变量中,例如$oldPicture

之后,你应该像这样删除图片:

if ((!!$oldPicture) && (file_exists($oldPicture))) {
    unlink($oldPicture);
}

只有在图像的路径具有值并且文件存在时,才能删除图像。确保$oldPicture 的路径正确。最后,在上面的 if 之后,您可以运行 update 命令。我不会深入研究安全问题,因为它超出了这个问题的范围,但请确保您阻止SQL injection

【讨论】:

  • 我尝试了你的建议并编辑了我发布的代码..你能看看它有什么问题吗?
  • 我没有你的数据库,所以如果你描述一下你在测试中的经历,我可以给你更多帮助。就目前情况而言,如果用户有以前的个人资料图片,您只会进行更新,这当然是不正确的。我的回答建议您应该在 if 之后执行更新,而不是在内部。即使您在数据库中没有任何价值或文件不存在,您也需要能够保存个人资料图片。
  • 我再次编辑了我的代码,但仍然没有运气:(我再次发布了我的新代码。
  • 正如我在之前的评论中问过你的那样,我会再次问:你能描述一下你的经历吗?我无权访问您的数据库,因此我无法测试您的代码,因此您仅更新代码的重复操作是不够的。 “不工作”和“没有运气”并不能描述您的问题。和我之前的评论一样,我必须再次指出,当且仅当用户已经存储了图片并且它存在于指定位置时,您编辑的代码仍会执行更新。您需要在 if 之后进行更新,而不是在其中。
猜你喜欢
  • 2017-08-10
  • 2022-08-03
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多