上传错误 - 文件不可写

时间:2013-04-23 22:29:46

标签: php html file file-upload multiple-files

我想将多个文件上传到服务器。

据我所知,文件不可写。

我能做什么,以便我的代码可以实际工作并上传文件。

PHP:

if(isset($_FILES ['uploaded_files']))
{

     foreach($_FILES['uploaded_files']['name'] as $key=>$value)
     {
          if(is_uploaded_file($_FILES['uploaded_files']['tmp_name'][$key]) && $_FILES['uploaded_files']['error'][$key] == 0)
          {

                $filename = $_FILES['uploaded_files']['name'][$key];

                if (is_writable($filename)) {
                        echo 'The file is writable';
                    } else {
                        echo 'The file is not writable';
                    }
                if(move_uploaded_file($_FILES['uploaded_files']['tmp_name'][$key], '../images/gallery'. $filename))
                {
                //code
                }
                else
                {
                      die ('There was a problem uploading the pictures.');
                } 
          }
          else
          {
            die ('There is a problem with the uploading system.');
          }
     }
}

HTML:

<form enctype="multipart/form-data" action="upload.php" method="POST">
        <input type="hidden" id="input_clone_id" name="input_clone_id" value="'.$row['id'].'"/>
        <input type="hidden" id="input_clone_var" name="input_clone_var" value="V"/>
            <input type="file" name="uploaded_files[]" id="input_clone" multiple="multiple" /><br />
        <input type="submit" style="margin-left:0" value="Upload Files" />
</form>

2 个答案:

答案 0 :(得分:1)

您正在检查您最近上传但尚未保存的文件是否可写,我认为这样的文件不会是可写的。 最好删除if,或者只检查要上传的文件夹是否可写。

除此之外,我检查了你的代码并且它有效。

答案 1 :(得分:1)

我发现这有两个问题。第一个是安全问题,第二个可能是导致问题的原因

您遇到安全问题

$filename = $_FILES['uploaded_files']['name'][$key];
...
if(move_uploaded_file($_FILES['uploaded_files']['tmp_name'][$key], '../images/gallery'. $filename))
...

问题a:由于$filename来自$ _FILES数组,因此无法信任。用户告诉您的网站他们的文件名称是什么,并把它放在那里。它们可以为您提供一些虚假的文件名,这些文件可能导致您的脚本以有趣的方式失败。在以任何方式使用之前,您需要清理该文件名。

问题b:通过允许用户指定文件名,他们可能只是通过指定冲突的文件名来覆盖“images / gallery”目录中的其他文件。避免这种情况的方法是使用数据库,为上传的文件生成唯一标识符,以该唯一名称存储文件,并在数据库中保留原始文件名和其他信息的记录。这样你总是知道原始文件名是什么,并且你没有机会试图覆盖该目录中的文件。

写作问题:*

您的“检查可写”声明是错误的。返回的文件名是用户在提交时使用的文件名。这不会指向你的文件系统上的任何一点...它指向他们(有时)你看不到的地方。你需要检查的是你的“../ images/gallery”目录是可写的而不是$filename。如果失败,您需要在images文件夹中执行“chmod -R 777 gallery”,如果您有命令行访问权限,或者如果您使用FTP与服务器通信,则通过您正在使用的任何FTP客户端进行全局写访问

那么,你应该为那张支票代替的是:

if (is_writable("../images/gallery")) {
    echo 'The file is writable';
} else {
    echo 'The file is not writable';
}

执行此操作后,如果您的脚本返回并说“文件可写”,则应该能够将文件复制到您的images / gallery文件夹中(请记住不要使用该名称用户提供的文件)。如果没有,也许您没有权限移动上传的文件。

至于上传文件的位置,我认为有时它们会在脚本执行结束后被删除有时,但如果没有,你可以回复文件的'tmp_name',如果你去那个目录,你会发现它坐在那里。这只是一个验证测试,以确保文件实际上到达您的服务器。只要您将上传文件移动到的目录上具有写入权限(即chmod 777所做的),您就应该能够将其复制到那里。