服务器操作系统:LINUX虚拟机;
php版本:5.1.6以上 
以下是代码:共有两个
//html上传部分<html><head>
  <title>文件上传</title>
</head><body>
      <form method="post" action="up_load.php" enctype="multipart/form-data">    <table border=0 cellspacing=0 cellpadding=0 align=center width="100%">      <tr>        <td width=55 height=20 align="center"> <input type="hidden" name="MAX_FILE_SIZE" value="2000000">文件: </TD>        <td height="16">        <input name="userfile" type="file" >
        <input type="submit" value="上传" >      </td>      </tr>    </table>    </form>
</body></html>
/**************************php处理部分/<?php
   $uploaddir = "./files/";//设置文件保存目录 注意包含/
   $type=array("jpg","gif","bmp","jpeg","png");//设置允许上传文件的类型
   $patch="http://192.168.3.1/";//程序所在路径
 //  echo "1";   //获取文件后缀名函数
      function fileext($filename)
    {
        return substr(strrchr($filename, '.'), 1);
    }
   //echo "2";    function random($length)
    {
        $hash = 'CR-';
        $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
        $max = strlen($chars) - 1;
        mt_srand((double)microtime() * 1000000);
            for($i = 0; $i < $length; $i++)
            {
                $hash .= $chars[mt_rand(0, $max)];
            }
        return $hash;
    }
   //echo "3";   $a=strtolower(fileext($_FILES['userfile']['name']));
   //echo "4" ;   //判断文件类型
   if(!in_array(strtolower(fileext($_FILES['userfile']['name'])),$type))
     {
        $text=implode(",",$type);
        echo "您只能上传以下类型文件: ",$text,"<br>";
     }
   else{
    $filename=explode(".",$_FILES['userfile']['name']);
    //echo  $filename[0];
    do{
            $filename[0]=random(10); //设置随机数长度
            $name=implode(".",$filename);
            //$name1=$name.".Mcncc";
            $uploadfile=$uploaddir.$name;
           // echo $uploadfile;
        }
   while(file_exists($uploadfile));
         //echo   $uploadfile;        if (move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadfile))
           {
                //输出图片预览
         if(is_uploaded_file($_FILES['userfile']['tmp_name']){
                echo "<center>您的文件已经上传完毕 上传图片预览:</center><br><center><img src='$uploadfile'></center>";
                echo " <br><center><a href='javascrīpt:history.go(-1)'>继续上传</a></center>";
              }
              else{
                echo "上传失败!";//[color=#993366]难道我不是POST提交的吗?

              }
           }[/color]   }//echo "test";
?>这是从网上DOWN的一个上传的源码?调了一下,可以上传文件,即在LINUX本地上可以看到上传的文件....
但为什么提示却是文件上传失败?....查了一下PHP手册关于is_uploaded_file();的用法:bool is_uploaded_file ( string $filename )
如果 filename 所给出的文件是通过 HTTP POST 上传的则返回 TRUE。这可以用来确保恶意的用户无法欺骗脚本去访问本不能访问的文件,例如 /etc/passwd。 这种检查显得格外重要,如果上传的文件有可能会造成对用户或本系统的其他用户显示其内容的话。 为了能使 is_uploaded_file() 函数正常工作,必段指定类似于 $_FILES['userfile']['tmp_name'] 的变量,而在从客户端上传的文件名 $_FILES['userfile']['name'] 不能正常运作。 
难道说我的文件不是POST提交的?还是LINUX上的哪些设置不对....请牛牛们指点....

解决方案 »

  1.   

    move_uploaded_file已经把文件移动走了,不要移动这个文件试试看呢
      

  2.   

    查阅了php的源码,注意看第6177行
    如果移动文件成功,会从 hash 表中删除那个文件名
    而 is_uploaded_file 恰好是根据文件名从 hash 表中查找这个项存在不存在
    所以 is_uploaded_file 返回失败只要记住 is_uploaded_file,必须在使用 move_uploaded_file 移动文件之前调用6128 PHP_FUNCTION(move_uploaded_file)
    6129 {
    6130     zval **path, **new_path;
    6131     zend_bool successful = 0;
    6132 
    6133 #ifndef PHP_WIN32
    6134     int oldmask; int ret;
    6135 #endif
    6136 
    6137     if (!SG(rfc1867_uploaded_files)) {
    6138         RETURN_FALSE;
    6139     }
    6140 
    6141     if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &path, &new_path) != SUCCESS) {
    6142         ZEND_WRONG_PARAM_COUNT();
    6143     }
    6144     convert_to_string_ex(path);
    6145     convert_to_string_ex(new_path);
    6146 
    6147     if (!zend_hash_exists(SG(rfc1867_uploaded_files), Z_STRVAL_PP(path), Z_STRLEN_PP(path)+1)) {
    6148         RETURN_FALSE;
    6149     }
    6150 
    6151     if (PG(safe_mode) && (!php_checkuid(Z_STRVAL_PP(new_path), NULL, CHECKUID_CHECK_FILE_AND_DIR))) {
    6152         RETURN_FALSE;
    6153     }
    6154 
    6155     if (php_check_open_basedir(Z_STRVAL_PP(new_path) TSRMLS_CC)) {
    6156         RETURN_FALSE;
    6157     }
    6158 
    6159     VCWD_UNLINK(Z_STRVAL_PP(new_path));
    6160     if (VCWD_RENAME(Z_STRVAL_PP(path), Z_STRVAL_PP(new_path)) == 0) {
    6161         successful = 1;
    6162 #ifndef PHP_WIN32
    6163         oldmask = umask(077);
    6164         umask(oldmask);
    6165 
    6166         ret = VCWD_CHMOD(Z_STRVAL_PP(new_path), 0666 & ~oldmask);
    6167 
    6168         if (ret == -1) {
    6169             php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", strerror(errno));
    6170         }
    6171 #endif
    6172     } else if (php_copy_file_ex(Z_STRVAL_PP(path), Z_STRVAL_PP(new_path), STREAM_DISABLE_OPEN_BASEDIR TSRMLS_CC) == SUCCESS) {
    6173         VCWD_UNLINK(Z_STRVAL_PP(path));
    6174         successful = 1;
    6175     }
    6176 
    6177     if (successful) {
    6178         zend_hash_del(SG(rfc1867_uploaded_files), Z_STRVAL_PP(path), Z_STRLEN_PP(path)+1);
    6179     } else {
    6180         php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to move '%s' to '%s'", Z_STRVAL_PP(path), Z_STRVAL_PP(new_path));
    6181     }
    6182     RETURN_BOOL(successful);
    6183 }