你的服务器是不是unix的呀
要考虑是否有写权限啊

解决方案 »

  1.   

    用upload_file_move()函数吧。
    copy函数不安全,另外你有什么出错信息吗?
    看看php.ini下关于upload部分是否配置好了,
    ;;;;;;;;;;;;;;;;
    ; File Uploads ;
    ;;;;;;;;;;;;;;;;; Whether to allow HTTP file uploads.
    file_uploads = On            //首先这个要为on才能上传; Temporary directory for HTTP uploaded files (will use system default if not
    ; specified).
    ;upload_tmp_dir =/tmp        //这个目录在unix肯定存在的,应该没问题,如果改了就..; Maximum allowed size for uploaded files.
    upload_max_filesize = 32M     //这个有没有限制?如果你写的1k,那...:)
      

  2.   

    这里没有语法错误, 所以也没有出错信息, 因为如果传到本地计算机 是没有问题的。现在是传到服务器上,失败了。在
    $uploadPicture_name=basename($uploadPicture);
    $uploadPicture_size=filesize($uploadPicture);
    的时候,$uploadPicture_size = false 所以不能继续执行了。
    所以说 没有什么错误提示。
      

  3.   

    $uploadPicture_size = false改为ture行嘛?
      

  4.   

    刚才看另一篇帖子的时候写了一个上传函数你试试。
    /**  BEGIN function 
    *
    * 作者:偶然
    * 功能:提示并刷新
    * 时间:2003.9.5
    * 变量:
    * notes = 提示信息
    * 返回:none
    * 示例:
    *
    */
    function alert_refresh($notes)
    {
    echo "<Script language='javascript'>window.alert('$notes');</script>";
    echo "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0; URL=".$_SERVER["HTTP_REFERER"]."\">";
    exit;
    }/**  BEGIN function 
    *
    * 作者:偶然
    * 功能:上传多种文件
    * 时间:2003.9.5
    * 变量:
    * file     = 临时文件
    * realname = 文件名
    * filetype = 允许上传的文件类型
    * dir      = 上传的文件夹
    *
    * 返回:none
    * 示例:
    * $filetype  = "jpg,png,jpeg,gif,rar,zip";//允许的文件类型
    * $tempfile  = $_FILES['file_name']['tmp_name'];//临时文件
    * $filename  = $_FILES['file_name']['name'];//文件名
    * $uploaddir = "upload";//自行指定
    * upload($tempfile,$filename,$filetype,$uploaddir);
    *
    */
    function upload($file,$realname,$type,$dir)
    {
    /* 判断是否有文件上传 */
    if(!$file)
    {
    alert_refresh("没有文件上传!");
    }

    /* 取得允许的文件类型 */
    $array = explode(',',$type); /* 清理多余空格 */
    $realname = str_replace(' ','',$realname); /* 取得文件后缀 */
    $postfix = substr(strrchr($realname,"."),1));

    /* 检查文件类型是否允许 */
    for($i=0; $i<count($array); $i++)
    {
    if($postfix == $array[$i])
    {
    $agree = '1';//设置上传标志位
    }
    }

    /* 如果类型正确便进行下面的操作 */
    if($agree==1)
    {
    /* 文件的保存路径,$dir由用户自己设置 */
    $dest = $dir.'/'.$realname; /* 确保文件能准确上传 */
    if(!is_uploaded_file($file))
    {
    alert_refresh("没有文件上传到指定位置!");
    } /* 查看目标目录是否存在,若不存在就建立一个 */
    if(!file_exists($dir)) 
    {
    $make = mkdir($dir,0755)
    if(!$make)
    {
        alert_refresh("文件夹建立失败!");
    }
    }
    else
    {
    /* 查看所上传的地方是否为一目录 */
    if(!is_dir($dir))
    {
    alert_refresh("所上传的位置不是一个目录!");
    } /* 检查上传文件是否存在 */
    if(file_exists($dest))
    {
    alert_refresh("你所上传的文件已经存在!");
    } /* 进行文件转移 */
    $r = move_uploaded_file($file,$dest);
    if($r == false)
    {
    alert_refresh("上传失败!");
    }
    else
    {
    alert_refresh("上传成功!");
    }
    }
    }
    else
    {
    alert_notes("文件类型不正确!");
    }
    }
      

  5.   

    提醒一下别忘了在表单中加上:enctype='multipart/form-data'
    曾经在本地调试时没有加上他也是成功的,但没有他在服务器上是决不可能成功。
      

  6.   

    传到服务器后 源文件变为:/tmp/phplMcgYsfalse  怎么才能得到它的文件名阿.
      

  7.   

    $dir_for_image = =..\files\ 要改为  $dir_for_image = =../files/,试试吧.
      

  8.   

    改了后 好像也是不行。 仍然是:/tmp/phplMcgYsfalse  这样的文件。有知道的吗? 嫌分少,我可以再加的。
      

  9.   

    因为出现了:/tmp/phplMcgYsfalse   这样的文件名,所以后面的copy也就不能正确执行了.
      

  10.   

    为什么传进来的时候$uploadPicture 中的文件名称就是乱码阿? 是不是 form的问题????
      

  11.   

    闲来无事,帮你调试通过了,需要指出来的问题是,你所写的函数有点问题,
    1)它只适用于register_globals=on的情况下,而在Off的条件中是不能通过的。
    2)另外希望你在调试时能把本地的php.ini中的出错显示打开,因为你的程序一到我这里就报错,可见并不是没有错,而是你忽视了错误的存在。
    3)还有一点要指出的是,调试时时常echo或是print_r一下你的条件是否成立。
    4)变量名太长了,降低了可读性,幸好我的耐性还比较好。
    5)书写不规范,有机会给你一份编程规范。
    以下我就不加上函数说明了,反正上面已讲得很清楚了。
    function uploadfile($dir_for_image,$uploadPicture,$tomask)
    {
    global $uploadPicture,$tomask,$uploadPicture_name,$uploadPicture_size;
        
    $uploadPicture_name = $uploadPicture['name'];
    $uploadPicture_size = filesize($uploadPicture['tmp_name']); if (!$uploadPicture_size)
    {
     $uploadPicture_size = 1;
    } //设置通配符mask;   //计算有几个通配符;
    $num_mask=count($tomask);
    if ($uploadPicture_size&&$uploadPicture_name!="")
    {
    $file=$dir_for_image.$uploadPicture_name;

    $length_uploadFile_name=strlen($uploadPicture_name);//当前上传文件名的长度;
    $extension_uploadFile_name=substr($uploadPicture_name,$length_uploadFile_name-3,$length_uploadFile_name-1);
    for ($i=1;$i<=$num_mask;$i++)
            {
    if ($extension_uploadFile_name==current($tomask))
    {
    echo  "<table align=center border=1 bordercolor=pink cellspacing=0><tr class=text2 align=center><td>禁止上传此类文件!</td></tr>";
    return 0;
    }
    next($tomask);
    } //检查当前要上传的目录里是否有同名文件;
    if(file_exists($file))
    {
    echo "<table align=center border=1 bordercolor=pink cellspacing=0><tr class=text2 align=center><td>同名文件存在,不能上传!</td></tr>" ;
    return 0;
    }
            else
    {
    if (!copy($uploadPicture['tmp_name'],$file))
    {
    echo "文件拷贝出错!<br>"; 
    return 0;
    }
                else
    {
                    return 1;
    }
    }
    }
    else

     echo "<table align=center border=1 bordercolor=pink cellspacing=0><tr class=text2 align=center><td>文件名不能为空,或者文件大小不能为零!</td></tr>";
             return 0; 
    }
    }
    ?>
    <head>
    <title>自助建站系统</title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <table width="100%" align="center" cellpadding="5" cellspacing="0">
    <form name="form2" method="post" action="" enctype='multipart/form-data'>
      <tbody>
      <tr> 
        <td height="30" align="right">文件:</td>
        <td> <input name="upfile" type="file" id="dir_pic" size="35" maxlength="150" class="boxttt1"></td>
      </tr>
      <tr> 
        <td height="30">&nbsp;</td>
        <td><input name="upload" type="submit" id="upload" value="保存设置"> 
        </td>
      </tr>
      </tbody>
     </form>
    </table>
    <?
    $dir_name = "upload/";
    $tomask = array("exe","php","asp","jsp");
    if(isset($_FILES['upfile']))
    {
        $uploadPicture = $_FILES['upfile'];
    uploadfile($dir_name,$uploadPicture,$tomask);
    }
      

  12.   

    ustb(偶然)非常感谢。 不过现在还是不能这个正确的复制成功。因为上传后
    ArrayuploadPicture = /tmp/phpCEZtLR 
    不知道这个地方是为什么而file= files/123.txt copy的时候就不成功了.服务器是UNIX不知道为什么 ?
      

  13.   

    print_r一下你的参数,设置断言分段调试。
      

  14.   

    用upload_file_move()函数吧。
    copy函数不安全,另外你有什么出错信息吗?
    看看php.ini下关于upload部分是否配置好了,
    ;;;;;;;;;;;;;;;;
    ; File Uploads ;
    ;;;;;;;;;;;;;;;;; Whether to allow HTTP file uploads.
    file_uploads = On            //首先这个要为on才能上传; Temporary directory for HTTP uploaded files (will use system default if not
    ; specified).
    ;upload_tmp_dir =/tmp        //这个目录在unix肯定存在的,应该没问题,如果改了就..; Maximum allowed size for uploaded files.
    upload_max_filesize = 32M     //这个有没有限制?如果你写的1k,
      

  15.   


    ;;;;;;;;;;;;;;;;
    ; File Uploads ;
    ;;;;;;;;;;;;;;;;; Whether to allow HTTP file uploads.
    file_uploads = On; Temporary directory for HTTP uploaded files (will use system default if not
    ; specified).
    ;upload_tmp_dir =; Maximum allowed size for uploaded files.
    upload_max_filesize = 2M我的设置是这样的。
      

  16.   

    现在的一个问题是,当执行完这个form后,点了上传后'$uploadPicture' 就变成了/tmp/phpCEZtLR ,并且存在。我想知道上传后,为什么文件的名字发生变化了? 服务器是UNIX。而本地计算机上传到临时目录没有发生变化的。这里大家也可以看一下ustb(偶然) 的代码,他的代码也是遇到这么一个问题。是因为设置有问题吗? 还是代码的问题?敬请高手指点。 echo "<form method='post' action='$PHP_SELF?Folder_ID=$Folder_ID'  ENCTYPE='multipart/form-data'>";
       echo "<table align=center border=1 bordercolor=pink cellspacing=0>";
       
       echo "<tr><td class=text2>上传</td>";   echo "<td><input class=input type='hidden' name='MAX_FILE_SIZE' value=4096000>";//设置最大可以上传的文件大小   echo "<input class=form TYPE='file' name='uploadPicture' size=20></td></tr>"; //2M图片上传      echo "</table><table align=center border=0><tr><td>";   echo "<input class=input type=submit name='upit' value='上传'></td></tr></table>";
      

  17.   

    这里的错误提示,我没法帖出来,因为PHP.ini文件在对方的计算机里。我没有权限去修改。
      

  18.   

    你所说的名字改变的问题那是肯定的,因为$uploadPicture只是临时文件,系统为了标识,所以将其改了名,我说过,最好用$_FILES[]数组来进行变量的取得,如果阁下非要直接传递,那我也没有办法了。
    今天早上到服务器上进行了测试,测试地址(http://www.trustbbs.com/uptest.php,只保留到今天中午--2003.10.23),我的代码没有问题。如果我的代码在你的机器上不能通过,那么请检查你的php.ini的设置。
    copy函数没有move_uploaded_file安全,最好别用。
      

  19.   

    是的, 你的代码是没有问题的。在我的计算机上也通过了。但是在win2000 对方的服务器是UNIX下是没有通过的。
    uploadPicture = /tmp/phppvF787 file= /home/qlky1csossv5g8v682l3/wwwroot/files/win2000命令全集.txt
    move_uploaded_file($uploadPIcture,$file)
    这样也是没有成功,  反回值是false$uploadPIcture用 is_uploaded_file($uploadPIcture) true
      

  20.   

    当然这里我就是把原来的copy 换成了move_uploaded_file了。
      

  21.   

    uploadPicture = C:\WINNT\TEMP\php17.tmp 
    file= files/win2000命令全集.txt 
    如果在我自己的计算机上
    move_uploaded_file($uploadPIcture,$file)
    这样就是成功的。
    为什么刚才的就是失败的呢?
      

  22.   

    在function里加上一句print_r($uploadPicture);看一下,告诉结果。
      

  23.   

    ( [name] => win2000命令全集.txt [type] => text/plain [tmp_name] => /tmp/phppZiDTN [error] => 0 [size] => 9976 )
      

  24.   

    现在用到的的代码是昨天晚上你发的。代码,除了动了路径$dir_name = "upload/";之外,其他都没有动。不知道为什么总是传输不成功。函数的代码我可以再贴一下,仅仅把copy改变了.
    如果这些都没有问题的话,可能是和设置有关系了.可是关于php.ini的设置 我已经设置了。我也发了上去了。
    <?
    function uploadfile($dir_for_image,$uploadPicture,$tomask)
    {
    global $uploadPicture,$tomask,$uploadPicture_name,$uploadPicture_size;
        print_r($uploadPicture);
    $uploadPicture_name = $uploadPicture['name'];
    $uploadPicture_size = filesize($uploadPicture['tmp_name']); if (!$uploadPicture_size)
    {
     $uploadPicture_size = 1;
    } //设置通配符mask;   //计算有几个通配符;
    $num_mask=count($tomask);
    if ($uploadPicture_size&&$uploadPicture_name!="")
    {
    $file=$dir_for_image.$uploadPicture_name;

    $length_uploadFile_name=strlen($uploadPicture_name);//当前上传文件名的长度;
    $extension_uploadFile_name=substr($uploadPicture_name,$length_uploadFile_name-3,$length_uploadFile_name-1);
    for ($i=1;$i<=$num_mask;$i++)
            {
    if ($extension_uploadFile_name==current($tomask))
    {
    echo  "<table align=center border=1 bordercolor=pink cellspacing=0><tr class=text2 align=center><td>禁止上传此类文件!</td></tr>";
    return 0;
    }
    next($tomask);
    } //检查当前要上传的目录里是否有同名文件;
    if(file_exists($file))
    {
    echo "<table align=center border=1 bordercolor=pink cellspacing=0><tr class=text2 align=center><td>同名文件存在,不能上传!</td></tr>" ;
    return 0;
    }
            else
    { echo  "uploadPicture = ".$uploadPicture['tmp_name']."                   file= ".$file;
    $resouce = '/tmp/'.$uploadPicture_name;
    echo '             resouce = '.$resouce;
    if(!is_uploaded_file($uploadPicture['tmp_name']))
    echo "               文件不存在                    ";
    else
    echo "              文件存在                ";
    //if (!copy($uploadPicture['tmp_name'],$file))
    if (!move_uploaded_file($uploadPicture['tmp_name'],$file))
    {
    echo "文件拷贝出错!<br>"; 
    return 0;
    }
                else
    {
    echo "文件拷贝成功!<br>"; 
                    return 1;
    }
    }
    }
    else

     echo "<table align=center border=1 bordercolor=pink cellspacing=0><tr class=text2 align=center><td>文件名不能为空,或者文件大小不能为零!</td></tr>";
             return 0; 
    }
    }
      

  25.   

    ustb(偶然) :
    你能把上传到Linux下的变量,告诉我一下吗?  这个变量就是在tmp文件夹下的文件名称? 我想看下是不是也是这样的乱码,谢谢。就是uploadPicture = /tmp/phppvF787 是不是也是这样的?谢谢
      

  26.   

    uploadPicture = /tmp/phppvF787 file= /home/qlky1csossv5g8v682l3/wwwroot/files/win2000命令全集.txt
    move_uploaded_file($uploadPIcture,$file)
    这样的书写是没有问题吧? 
    如果是没有问题,就是配置的问题了.这样的书写在linux下是没有问题的吧?
      

  27.   

    ;;;;;;;;;;;;;;;;
    ; File Uploads ;
    ;;;;;;;;;;;;;;;;; Whether to allow HTTP file uploads.
    file_uploads = On; Temporary directory for HTTP uploaded files (will use system default if not
    ; specified).
    ;upload_tmp_dir =; Maximum allowed size for uploaded files.
    upload_max_filesize = 2M
    这里的配置都与这个现象不符合。说明这里的配置都是正确的。
      

  28.   

    你的配置对吗?自己看看对不对!!; File Uploads ;
    ;;;;;;;;;;;;;;;;; Whether to allow HTTP file uploads.
    file_uploads = On; Temporary directory for HTTP uploaded files (will use system default if not
    ; specified).
    ;upload_tmp_dir =
    **************前面的分号没去掉,第二,后面也没附值,你想让他的临时文件传到哪去?
    ****************
    ; Maximum allowed size for uploaded files.
    upload_max_filesize = 2M
    这里的配置都与这个现象不符合。说明这里的配置都是正确的。
      

  29.   

    你说的这个地方根本就不对。我没有设置,说明是放到默认目录下了。并不是一定要设置的。这个地方我在windows中试验过的,不用设置就可以的。况且我在linux下能检测到文件的存在,说明已经上传上去了 。源文件目标文件我都显示出来了。大家可以去http://lycos58623.l97.lycos.com.cn/test.php 这里试验一下。
    if(!is_uploaded_file($uploadPicture['tmp_name']))
    echo "               文件不存在                    ";
    echo "源文件是:".$uploadPicture['tmp_name']."      目标文件是:".$file;
    ////if (!copy($uploadPicture['tmp_name'],$file))
    if (!move_uploaded_file($uploadPicture['tmp_name'],$file))
    {
    echo "  文件 move_uploaded_file源,目标,  没有成功!<br>"; 
    return 0;
    }
      

  30.   

    我把源和目标都echo 出来了,你去看看吧.
      

  31.   

    源文件是:/tmp/phpHQyBeD 目标文件是:files/flash441.htm 文件 move_uploaded_file源,目标, 没有成功!源:/tmp/phpUp12cf
    目标:upload/flash441.htm 上面的是我的没有成功,下面的是你的成功了
    说明与函数没有关系了,与设置有关系,可是可能是与什么设置有关系呢?
    因为在windows下是可以的。搞不懂!
      

  32.   

    允许上传的,现在修改里面的文件我都是用FTP上传的。
      

  33.   

    他说很多程序放到上面都是可以的。为什么我们的不行。都这么说我们,说我们必须找出一个原因来才能修改。难道是路径不对吗? 可是同样的路径 我放到windows中就是可以的。在windows下路径是对的。既然能上传到临时文件夹 ,怎么就不能复制到需要的文件夹呢?我对linux一窍不通, 见笑了。所以不清楚这些问题。