Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何让我有机会选择是否覆盖现有上载文件?_Php - Fatal编程技术网

Php 如何让我有机会选择是否覆盖现有上载文件?

Php 如何让我有机会选择是否覆盖现有上载文件?,php,Php,我到处搜索,想找到一本教程来满足我的简单需求,但直到现在我都找不到答案,也无法完成我的脚本工作 我的脚本应执行以下操作: 用户选择要上载的文件并单击提交 脚本检查文件是否已经存在 如果文件不存在,则将文件上载到目标 如果文件已经存在,则询问用户:“是否覆盖?” 如果用户单击“覆盖”,则覆盖文件 index.php <form action="check.php" method="post" enctype="multipart/form-data"> <input

我到处搜索,想找到一本教程来满足我的简单需求,但直到现在我都找不到答案,也无法完成我的脚本工作

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

  • 用户选择要上载的文件并单击提交
  • 脚本检查文件是否已经存在
  • 如果文件不存在,则将文件上载到目标
  • 如果文件已经存在,则询问用户:“是否覆盖?”
  • 如果用户单击“覆盖”,则覆盖文件
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>";  
   }    
}
    ?>

在表单中添加复选框以确认“覆盖”:

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

}