使用unlink()删除后文件仍然存在

时间:2020-05-12 00:44:28

标签: php unlink

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

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

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

奇怪的是,当我第二次选择图片时,它仍然有效。 [在此处输入链接说明] [1]

我尝试在clearstatcache()之后使用unlink(),但是没有任何作用。下面是我的代码。请帮忙。如果有帮助,请访问以下视频链接,该视频显示了代码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>";
    }
}

1 个答案:

答案 0 :(得分:1)

逐步了解正在发生的事情。假设您是第一次访问浏览器中的页面时正在运行的代码:

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

  2. 尚未发布任何内容,因此代码的图像处理部分无法运行。代码完成,页面完成,让用户查看当前图像和表单。此页面加载已全部完成。

  3. 现在,用户添加新照片,然后单击提交。这将发布到您的PHP。这意味着需要一个新页面,并且代码将在浏览器中显示它。

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

  5. 现在,处理将继续进行测试以查看是否已发布图像。是的,因此图像处理部分开始运行-您的旧图像被删除,新图像移到适当位置。

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

要查看新图像,您需要重新加载页面。尝试-但不要直接点击reload,因为这将再次发布-单击浏览器的URL栏中,然后按Enter,或复制URL并尝试一个新选项卡,以使用GET加载页面。您会看到新图像。

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

那么如何解决呢?您确实只需要切换两个部分的处理顺序:

// 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>