如何确定PHP move_uploaded_file失败的原因

时间:2014-09-15 02:34:22

标签: php

鉴于:

function upload($file_id, $destination) {
  $folder = "/uploads";
  $types = "jpg, jpeg, gif, tiff, png";
  if (! $_FILES [$file_id] ['name'])
      return false;

  $fileName = $_FILES [$file_id] ['name'];

  if (! testExtensions ( $fileName, $types )) {
      echo ("<p>FAILED TEST EXTENSIONS</p>");
      return false;
  }

  $uniqer = substr ( md5 ( uniqid ( rand (), 1 ) ), 0, 5 );
  $fileName = $uniqer . '_' . $fileName; // Get Unique Name
  $path = getPath ( $destination ) . "/";

  $uploadFile = $path . $fileName;

 if (! move_uploaded_file ( $_FILES [$file_id]['tmp_name'], $uploadfile )) {
    return false;
 } else {
    if (! $_FILES [$file_id] ['size']) { // Check if the file is made
        @unlink ( $uploadfile ); // Delete the Empty file
        $file_name = '';
        return false;
    } else {
        chmod ( $uploadfile, 0777 ); // Make it universally writable.
    }
  }

 return $file_name;
}

function getPath($destination) {
  $path = getcwd ();

  $pathParts = explode ( "/", $path );
  array_pop ( $pathParts );

  array_push ( $pathParts, $destination );

  $path = implode ( "/", $pathParts );

  return $path;
}

 function testExtensions($fileName, $types) {
  $extensions = split ( "\.", basename ( $fileName ) );
  $extension = strtolower ( $extensions [count ( $extensions ) - 1] ); // Get the last extension

  $all_types = explode ( ",", strtolower ( $types ) );
  if ($types) {
    if (! in_array ( $extension, $all_types ))
        return false;
  }
  return true;
}

有没有办法测试为什么move_uploaded_file失败?我已经生成了一些跟踪输出以确保一切都有意义,但所有输出似乎都表明move_uploaded_file应该正常工作。但是,该函数始终返回false。

1 个答案:

答案 0 :(得分:1)

只有可能的原因我知道 move_uploaded_file失败是您文件的目的地。它可以是dir的权限,也可以不存在(除了语法错误)。

要解决此问题,您必须编辑目标目录的权限。最小特权原则适用。只为用户提供他们需要的权利,而不是更多。

在这种情况下,如果Apache仅提供页面,请为用户提供无权编辑的权限。可能存在的风险包括:更改文件内容或上传新内容;将可执行代码添加到文件等。无论是单个站点的倍数,这些风险都存在。如果应用程序需要编辑特定文件,请将权限更改限制为该文件。

Here's how to change it

[me@linuxbox me]$ chmod 600 some_file

理想情况下,您需要权限代码

766 - 文件的所有者可以读取,写入和执行该文件。但其他人只能读写。

但为了安全起见,您可以使用:

755 - 文件的所有者可以读取,写入和执行该文件。所有其他人都可以阅读并执行该文件。此设置适用于所有用户使用的程序..

<强>更新

您可以使用以下命令更改整个目录的权限:

find /opt/lampp/htdocs -type d -exec chmod 755 {} \;

假设该位置为/opt/lampp/htdocs

正如Barmar所引用的那样,如果文件已上传,您可以检查该文件的大小。我提到的修复是你自己移动文件的时候。