我正在创建一个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>";
}
}
答案 0 :(得分:1)
逐步了解正在发生的事情。假设您是第一次访问浏览器中的页面时正在运行的代码:
代码的第一部分显示一个表单和当前图片。
尚未发布任何内容,因此代码的图像处理部分无法运行。代码完成,页面完成,让用户查看当前图像和表单。此页面加载已全部完成。
现在,用户添加新照片,然后单击提交。这将发布到您的PHP。这意味着需要一个新页面,并且代码将在浏览器中显示它。
发生的第一件事-代码的顶部-是代码显示表单和 current 图片。尚未进行图像处理。我们刚刚发布了一个新图像,但尚未对其进行任何处理,因此顶部的显示代码仅显示仍在磁盘上的旧照片。
现在,处理将继续进行测试以查看是否已发布图像。是的,因此图像处理部分开始运行-您的旧图像被删除,新图像移到适当位置。
现在处理完成,一切停止。即使现在已将其删除并添加了新图片,用户仍可以查看在步骤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>