0

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

据我所见,文件不可写。

我该怎么做才能使我的代码实际工作并上传文件。

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

2 回答 2

1

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

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

于 2013-04-23T22:38:34.450 回答
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”目录是可写的,而不是$filename. 如果失败,如果您有命令行访问权限,则需要在图像文件夹中执行“chmod -R 777 gallery”,或者如果您使用 FTP 与服务器通信,则通过您正在使用的任何 FTP 客户端为其提供世界写入访问权限.

因此,您应该拥有的是:

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

之后,如果您的脚本返回并显示“文件是可写的”,它应该能够将文件复制到您的图像/画廊文件夹中(记住不要使用用户给您的文件的名称)。如果没有,也许您没有权限移动上传的文件。

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

于 2013-04-23T22:45:04.623 回答