如何让我有机会选择我想要覆盖现有上传文件的天气?

时间:2015-07-30 09:17:34

标签: php

我到处搜索,找到了一个简单需要的教程,但直到现在我找不到答案,也无法让我的脚本工作。

我的脚本应该执行以下操作:

  • 用户选择要上传的文件,然后点击提交
  • 脚本检查文件是否已存在
  • 如果文件不存在则将文件上传到目的地
  • 如果该文件已存在,则询问用户:“覆盖?”
  • 如果用户点击“覆盖?”然后覆盖文件

的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"; 
?>

2 个答案:

答案 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