我到处搜索,找到了一个简单需要的教程,但直到现在我找不到答案,也无法让我的脚本工作。
我的脚本应该执行以下操作:
的index.php
<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>";
}
}
?>
overwrite.php
<?php
$upload = $_POST["upload"];
$target_file = $_POST["target_file"];
move_uploaded_file($upload, $target_file);
echo "The file is overwritten";
?>
答案 0 :(得分:1)
您拥有的脚本不会按原样运行,因为您无法预设隐藏的字段值以便让用户上传文件。此外,即使它确实有效,也需要将文件上传两次。
理想情况下,最好是在用户花费任何时间实际上传文件之前检查文件是否存在并且是否被覆盖。但这取决于你如何指示文件存在。
如果用户提供的文件名匹配(如您的代码现在所做的那样),您是否会说该文件存在?正如Loenix所提到的,依靠用户提供文件名作为存储它的方式并不是一个好主意。您可以使用内容..我们使用sha1()
值作为文件名存储文件。这样,相同的文件(无论其名称如何)不占用磁盘空间,并且不同的文件(即使具有相同的名称)可以共存。元数据(文件名,路径等)存储在数据库中。
然而,您最终做出此决定,您要做的是首先向服务器提交一个AJAX请求,检查文件是否存在,如果存在,则提示用户覆盖。只有当用户选择覆盖,或者文件不存在时,才会将文件实际上传到服务器并保存。
答案 1 :(得分:0)
在表单中添加一个复选框以确认&#39;覆盖&#39;:
<input type='checkbox' name='overwriteIfExists' value='1'>
然后在您的表单处理中:
if (file_exists($target_file)) {
if(isset($_POST['overwriteIfExists'])){
// overwrite file
} else {
// dont overwrite file
}
}
复选框值仅在选中后才会发送,因此,如果未选中该复选框,则$_POST['overwriteIfExists']
将不存在且(isset($_POST['overwriteIfExists']))
将为false