使用 unlink() 删除后文件继续存在

File continues to exist after deletion with unlink()

我正在创建一个 edit-profile PHP 页面,用户可以在其中更改其个人资料图片。

最初,页面显示原始图片,但一旦选择新图片并按下提交按钮,图片应立即更新。按下提交按钮后,我使用 unlink() 删除原始文件,然后 move_uploaded_file() 将新图片放入文件夹中。

虽然原来的图片被删除了,我可以看到新的图片已经移动到文件夹中,但它仍然告诉我原来的文件夹存在并且没有显示新的图片。相反,我只是得到一个小缩略图,告诉我在指定的 URL 处没有文件。如果我在提交时打印 $uploaded_files 变量,它会给我原始图片,即使它已被删除。

奇怪的是当我第二次选择图片时它起作用了。 [在此处输入 link 描述][1]

我尝试在 unlink() 之后使用 clearstatcache(),但没有任何作用。下面是我的代码。请帮忙。如果有帮助,这里是一个 link 视频,其中包含代码所发生的情况:https://youtu.be/kZMDykuVVKo

<form method='post' action='edit-profile.php' enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="200000">
<p><label for="upload">Select a new profile picture:</label><br> <input type="file" name="picture"></p>

<?php 
$uploaded_files = scandir('users/someUser/profilePicture');
$path = 'users/someUser/profilePicture';
for($i=0; $i<count($uploaded_files); $i++) {
    if(is_file("$path/{$uploaded_files[$i]}")) {
        print "<img src='users/someUser/profilePicture/{$uploaded_files[$i]}'><br>";
    }
}

print '<input type="submit" name="profile_picture_submit" value="Change Picture" class="button--pill">
</form>';  

if (isset($_POST['profile_picture_submit'])) {
    unlink('users/someUser/profilePicture/'. $uploaded_files[2]);

    $file_ext = explode('.', $_FILES['picture']['name']);
    $file_ext = strtolower(end($file_ext));
    $allowed = array('png', 'jpg');

    if(in_array($file_ext, $allowed)) {
        if(move_uploaded_file($_FILES['picture']['tmp_name'], "users/someUser/profilePicture/{$_FILES['picture']['name']}")) {
            echo "Your file has been uploaded";
        }
        else {
            echo "There was a problem uploading the file"; 
        }
    }
    else {
        print "<p class='error'>Type $file_ext is not allowed.</p>";
    }
}

了解正在发生的事情。让我们想象一下您第一次在浏览器中访问该页面时的代码 运行ning:

  1. 代码的第一部分显示一个表单,以及当前图片。

  2. 还没有 POSTed,所以代码的图像处理部分没有 运行。代码完成,页面完成,用户只剩下查看当前图像和表单。此页面加载全部完成。

  3. 现在用户添加了一张新照片,并点击提交。这 POST 发送给您的 PHP。这意味着请求了一个新页面,代码将在浏览器中显示它。

  4. 发生的第一件事 - 代码的顶部 - 是代码显示表单和 current 图像。尚未进行任何图像处理。我们刚刚 POST 编辑了一张新图片,但尚未对它进行任何处理,因此顶部的显示代码仅显示仍在磁盘上的旧图片。

  5. 现在,处理继续进行测试以查看图像是否被 POSTed。是的,所以图像处理部分 运行s - 您的旧图像被删除,新图像移到位。

  6. 现在处理完成,一切停止。用户仍然在查看表单和在步骤 4 中显示的旧图片,即使它现在已被删除并添加了一张新图片。

要查看新图片,您需要重新加载页面。尝试一下 - 但不要只点击重新加载,因为那样会再次 POST - 点击浏览器的 URL 栏,然后点击回车,或者复制 URL 并在新标签中尝试,使用 GET 加载页面。你会看到你的新形象。

当然,如果您像在视频中那样重复添加新图像的过程,您也会看到新图像,因为这次新图像是磁盘上的图像。

那么怎么解决呢?您真的只需要切换 2 个部分的处理顺序:

// First check if an image was uploaded, and do that processing if so
if (isset($_POST['profile_picture_submit'])) {
    // ... your code ...
}

<!-- Now images have been handled, display whatever is on disk -->
<form method='post' action='edit-profile.php' enctype="multipart/form-data">
    // ... your code ...
</form>