2012-10-03 112 views
2

我想上传一个文件,所以这里是我的html:PHP的mkdir失败

<form action="upload_file.php" method="post" enctype="multipart/form-data"> 
    Select a file: <input type="file" name="upload"> 
    <input type="submit"> 
</form> 

这里是我的PHP:

<?php 
    ini_set('display_errors', 'On'); 
    error_reporting(E_ALL | E_STRICT); 
    session_start(); 
    $allowedExts = array("doc", "docx"); 
    $extension = pathinfo($_FILES["upload"]["name"],PATHINFO_EXTENSION); 

    if (($_FILES["upload"]["size"] < 200000) 
    && in_array($extension, $allowedExts)) { 
     if ($_FILES["upload"]["error"] > 0) 
     { 
      echo "Return Code: " . $_FILES["upload"]["error"] . "<br />"; 
     } 
     else 
     { 
      echo "Upload: " . $_FILES["upload"]["name"] . "<br />"; 
      echo "Type: " . $_FILES["upload"]["type"] . "<br />"; 
      echo "Size: " . ($_FILES["upload"]["size"]/1024) . " Kb<br />"; 
      echo "Temp file: " . $_FILES["upload"]["tmp_name"] . "<br />"; 

      $dir_exists = is_dir("Proposals/". $_SESSION["FirstName"] ."/"); 
      $file_exists = file_exists("Proposals/".$_SESSION["FirstName"] ."/" . $_FILES["upload"]["name"]); 
      $folderName=$_SESSION["FirstName"]; 
      $baseDir = "Proposals" ; 
      //var_dump($_FILES); 
      //die(); 
      // Create directory if it does not exist 
      if (! $dir_exists) { 
       if(!is_dir($baseDir)) 
        mkdir($baseDir); 
       mkdir($baseDir . DIRECTORY_SEPARATOR . $_SESSION["FirstName"]); 
      } 

      if ($file_exists) { 
       echo $_FILES["upload"]["name"] . " already exists. "; 
      } else { 
       move_uploaded_file($_FILES["upload"]["tmp_name"], 
       "Proposals/". $_SESSION["FirstName"] ."/". $_FILES["upload"]["name"]); 
       echo "Stored in: " . "Proposals/". $_SESSION["FirstName"] ."/". $_FILES["upload"]["name"]; 
      } 
     } 
    } else { 
     echo "Invalid file"; 
    } 

?> 

文件输出:

Type: application/msword 
Size: 124.9296875 Kb 
Temp file: /tmp/phpUWDc3s 

后续代码var_dump输出这对一个测试文件:

array(1) { ["upload"]=> array(5) { 
["name"]=> string(18) "Test.doc" 
["type"]=> string(18) "application/msword" 
["tmp_name"]=> string(14) "/tmp/phpUWDc3s" 
["error"]=> int(0) 
["size"]=> int(127928) } } 

而且警告/错误它给了我是:

Strict Standards: Only variables should be passed by reference in /disks/vhosts/***/***/upload_file.php on line 6 Upload: Test.doc 

没有的mkdir代码它给我:

Warning: move_uploaded_file(Proposals/Test.doc): failed to open stream: Permission denied in /disks/vhosts/***/***/upload_file.php on line 40 Warning: move_uploaded_file(): Unable to move '/tmp/phpQmgxdO' to 'Proposals/Test.doc' in /disks/vhosts/***/***/upload_file.php on line 40 Stored in: Proposals/Test.doc 

出于某种原因,有或没有MKDIR,没有文件被放在建议书中,即使它是正确的文件类型。这只是服务器的权限问题,还是有一些我必须添加/更改才能使这一切工作?

+1

尝试给'file_put_contents(“提案/ Test.txt的”,“测试”);'在脚本的顶部,看看是否正在创建的文件。 – air4x

回答

1

A.第一误差

严格的标准:只有变量应该通过引用/磁盘/虚拟主机传递/ / /upload_file.php第6行上载:Test.doc的

变化

$extension = end(explode(".", $_FILES["upload"]["name"])); 

$extension = path_info($_FILES["upload"]["name"],PATHINFO_EXTENSION); 

B.第二误差

警告:move_uploaded_file(提案/ Test.doc的):未能打开流:允许在拒绝/磁盘/虚拟主机/ / /upload_file.php第40行警告:move_uploaded_file():无法将/ disks/vhosts中的'/ tmp/phpQmgxdO'移动到'Proposals/Test.doc'/ / /upload_file.php on line 40存储在:Proposals/Test .DOC

使用这样的完整路径/disks/vhosts/***/***/

$baseDir = __DIR__ ; // or /disks/vhosts/***/***/ has applicable 
if (! $dir_exists) { 
    if (is_writable("$baseDir/Proposals/")) { 
     mkdir("$baseDir/Proposals/" . $_SESSION["FirstName"]); 
    } else { 
     trigger_error("Proposals/ is not writeable"); 
    } 
} 
+0

嗯,没有工作。它仍然没有创建一个目录。现在警告是:警告:mkdir():许可在第31行的/disks/vhosts/***/***/upload_file.php中被拒绝警告:move_uploaded_file(Proposals/***/Test.doc):失败打开流:第38行/disks/vhosts/***/***/upload_file.php中没有这样的文件或目录警告:move_uploaded_file():无法将'/ tmp/php9zFSIM'移动到'Proposals/** */Test.doc'在第38行中的/disks/vhosts/***/***/upload_file.php存储在:Proposals/***/Test.doc' –

+0

@Charlie Yabben使用完整的系统路径... 。像/ disks/vhosts/***/***/Proposal /' – Baba

+0

那么无论我有什么“Proposals /”改为“/ disks/vhosts/***/***/Proposals”? –

1

您目前有这样的代码......

if(!$dir_exists) { 
    mkdir("Proposals/". $_SESSION["FirstName"]); 
} elseif ($file_exists) { 
    echo $_FILES["upload"]["name"] . " already exists. "; 
} else { 
    move_uploaded_file($_FILES["upload"]["tmp_name"], 
    "Proposals/". $_SESSION["FirstName"] ."/". $_FILES["upload"]["name"]); 
    echo "Stored in: " . "Proposals/". $_SESSION["FirstName"] ."/". $_FILES["upload"]["name"]; 
} 

哪样,如果你正在寻找的目录只存在move_uploaded_file。移动以下的if声明说行,然后它应该创建目录如果需要的话,然后上传文件。

+0

是啊,我只是注意到,逻辑错误以及。它现在已经修复但仍不能创建目录。更新后的代码。 –

+0

我刚刚测试了代码,它对我来说工作得很好。确保php用户(取决于OS)能够在此目录中写入。如果您不确定php用户是谁,请执行'echo exec('whoami');'。这将在你的操作系统中回显出php用户。我目前在Mac上,所以我的是'_www'。这意味着'_www'用户需要在您托管这些脚本的目录中读取和写入权限。 –