Php 如何让我有机会选择是否覆盖现有上载文件?
我到处搜索,想找到一本教程来满足我的简单需求,但直到现在我都找不到答案,也无法完成我的脚本工作 我的脚本应执行以下操作:Php 如何让我有机会选择是否覆盖现有上载文件?,php,Php,我到处搜索,想找到一本教程来满足我的简单需求,但直到现在我都找不到答案,也无法完成我的脚本工作 我的脚本应执行以下操作: 用户选择要上载的文件并单击提交 脚本检查文件是否已经存在 如果文件不存在,则将文件上载到目标 如果文件已经存在,则询问用户:“是否覆盖?” 如果用户单击“覆盖”,则覆盖文件 index.php <form action="check.php" method="post" enctype="multipart/form-data"> <input
- 用户选择要上载的文件并单击提交
- 脚本检查文件是否已经存在
- 如果文件不存在,则将文件上载到目标
- 如果文件已经存在,则询问用户:“是否覆盖?”
- 如果用户单击“覆盖”,则覆盖文件
<form action="check.php" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<button type="submit" value="upload">Upload</button>
</form>
上传
check.php
<?php
if(isset($_FILES['file'])) {
$file = $_FILES['file'];
$upload = $_FILES["file"]["tmp_name"];
$target_file = 'files/'.basename($_FILES["file"]["name"]);
if (file_exists($target_file)) {
echo "File already exist";
echo "<form action='overwrite.php' method='post'>
<input type='hidden' name='upload' value='$upload'>
<input type='hidden' name='target_file' value='$target_file'>
<button type='submit'> Overwrite?</button>
</form>";
}
else {
move_uploaded_file($upload, $target_file);
echo "File was successfully uploaded";
echo "<a href='index.php'><button>back</button></a>";
}
}
?>
在表单中添加复选框以确认“覆盖”:
<input type='checkbox' name='overwriteIfExists' value='1'>
复选框值只有在选中时才会发送,因此如果未选中复选框,$\u POST['OverwriteiExists']
将不存在,(isset($\u POST['OverwriteiExists'])
将为false
您使用的脚本将无法正常工作,因为您无法预设隐藏字段值以让用户上载文件。此外,即使它确实有效,也需要上传两次文件
理想情况下,最好在用户实际上传文件之前检查该文件是否存在并被覆盖。但这取决于您如何指定文件存在
如果用户提供的文件名匹配(就像您的代码现在所做的那样),您会说该文件存在吗?正如Loenix所提到的,依靠用户提供文件名作为存储文件的方式不是一个好主意。你可以使用这些内容。。我们使用sha1()
值作为文件名来存储文件。这样,相同的文件(无论名称如何)都不会占用磁盘空间,不同的文件(即使名称相同)也可以共存。元数据(文件名、路径等)存储在数据库中
不管最终如何确定,您要做的是首先向服务器提交一个AJAX请求,检查文件是否存在,如果存在,则提示用户覆盖。只有当用户选择覆盖或文件不存在时,文件才会实际上载到服务器并保存。包括复选框,在发布的变量中选中该复选框的值,如果选中,则删除该文件。用户可以提前决定是否删除/覆盖,而不是上传然后询问。这与web编程的一些规则是一样的:-不要将用户文件名用作有效文件名,不要在自己的服务器上使用它而不转义。-始终检查是否未发生错误。你会检查文件名或文件内容吗?你好,谢谢,你能举个例子吗?我不知道你到底是什么意思。我这样做可能吗?是否将值发布到overwrite.php?你的意思是要勾选.php吗?OP要求用户只有在脚本验证文件存在时才可以选择覆盖。您好,谢谢,但我需要的问题不是在表单中覆盖,而是在勾选文件后的第二页上exists@NickCoons好啊自我提示:“阅读问题”Thanks@Chris:check.php上有一个表单要求用户覆盖。我的表格很好用,唯一的问题是,文件没有被覆盖。谢谢你的回答。因为我是初学者,所以很难完全实现您所说的,因为我从未使用过Ajax。但我会给它一个机会try@Jarla,如果您最终将一些有困难的代码放在一起,请随意将其作为一个新问题发布,然后在此处添加该问题的链接进行评论,我很乐意为您检查。
<input type='checkbox' name='overwriteIfExists' value='1'>
if (file_exists($target_file)) {
if(isset($_POST['overwriteIfExists'])){
// overwrite file
} else {
// dont overwrite file
}
}