move_uploaded_file()返回false

时间:2017-01-03 22:32:45

标签: php file upload

我有一个大问题,我无法解决..

我必须上传多个文件,这就是我使用的

HTML:

<form action="" method="post" enctype="multipart/form-data">
           Seleziona uno o più file<br />
            <input name="upload[]" type="file" multiple="multiple" />
            <input type="hidden" name="pathFileToUpload" value="<?php echo $dirToScan ?>">
            <input type="submit" value="Carica file" />
        </form>

PHP:

$target_dir = $_POST['pathFileToUpload'];
$total = count($_FILES['upload']['name']);
  for ($i = 0; $i < $total; $i++) {
    $tmpFilePath = $_FILES['upload']['tmp_name'][$i];
      if (move_uploaded_file($tmpFilePath,$target_dir)) 
            echo "<script>alert('upload')</script>";
 else 
        echo "<script>alert('Not uploaded')</script>";
 }     

所以,我可以看到文件正确传递给服务器,所以$ tmpFilePath包含php中文件的临时路径,而$ target dir是正确的,但每次上传都出错而且move_uplaoded_file返回false。

我也尝试用一些路径替换$ target_dir,我确信它们存在,但没有。

该函数有权在服务器中移动文件,因为首先只有一个上传文件,它才能完美运行......

PS:我已经在论坛中搜索了,但是没有发现任何我的情况,我尝试使用$ _SERVER ['Document_root']找到很多解决方案。'uploads /'但已经没有了......

1 个答案:

答案 0 :(得分:1)

move_uploaded_file function应该接收您要创建的文件的名称作为第二个参数:

bool move_uploaded_file ( string $filename , string $destination )

在您的代码中看起来$target_dir变量只是文件夹的名称,而不是完整的目标(文件夹+要创建的新文件),否则您就知道了php覆盖目录,并没有任何意义。

您可以使用从用户处获得的文件的原始名称:

$target_dir = $_POST['pathFileToUpload'];
$total = count($_FILES['upload']['name']);
for ($i = 0; $i < $total; $i++) {
    $tmpFilePath = $_FILES['upload']['tmp_name'][$i];
    $name = basename($_FILES["upload"]["name"][$i]);
    if (move_uploaded_file($tmpFilePath, $target_dir . "/" . $name)) 
        echo "<script>alert('upload')</script>";
    else 
        echo "<script>alert('Not uploaded')</script>";
}     

或者给文件一个新的随机名称。