为什么总是文件上传失败?下面是我的代码
先是web的:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>上传文件</title>
</head>
<body>
<form enctype="multipart/form_data" action="upload_file.php" method="post"> <input type="hidden" name="MAX_FILE_SIZE" value="32000"/> 上传文件: <input name="sendfile" type="file"/><br/> <pre>        <input type="submit" value="上 传"/></pre>
</form>
</body>
</html>下面是php的:
<?php
print "<pre>";
$store_dir='d:\\upload\\'; //文件上传后存储在服务器的路径
$uploadfile="$store_dir".basename($_FILES['sendfile']['name']); //上传文件的原始名字
$uploadfile_tmp=$_FILES['sendfile']['name_tmp']; //上传文件的临时名字
$err_msg=$_FILES['sendfile']['error']; //上传文件时产生的错误信息if ($err_msg){
print "错误代码: $err_msg<br/>";
}
if (!is_writeable($store_dir)){ //检查上传的文件是否可写
print "$store_dir 目录不可写\n";
exit;
}
else{
print "$store_dir 目录可写\n";
}if(isset($_FILES['sendfile'])) {
if(is_uploaded_file($uploadfile_tmp)){ //检查上传的文件是否存在,如果存在则对其进行下一步操作
print "文件检验成功\n";
}
else {
print "文件检验失败,可能遭受文件上传攻击!";
exit;
}
if (move_uploaded_file($uploadfile_tmp,$uploadfile)) {  //对上传的合法文件,将其重命名并移动到服务器的上传文件夹中
print "文件上传成功\n";
}
else{
print "移动文件失败,可能遭受文件上传攻击!";
exit;
}
print "文件上载成功!<br/>";
}
else{
print "文件上载失败!<br/>";
}
print '$_FILES=';
print_r($_FILES);
print "</pre>";
?>

解决方案 »

  1.   

    d:\upload\目录可写
    文件上载失败!
    $_FILES=Array
    (
    )
      

  2.   

    你的提交表单有问题,你的文件并没有提交过去,测试你的代码输出的内容是空<html>
    <body><form action="upload_file.php" method="post" enctype="multipart/form-data">
    <label for="file">Filename:</label>
    <input type="file" name="file" id="file" /> 
    <br />
    <input type="submit" name="submit" value="Submit" />
    </form></body>
    </html>你用这一段代码替换你的代码 就可以了
      

  3.   

    找到你的错误了 
    你的表单中<form enctype="multipart/form_data" action="upload_file.php" method="post">
    其中form_data 不是下划线 是中线 ,下次细心点 或者直接用提示的 这种错误最纠结了   
    你改成
    <form enctype="multipart/form-data" action="upload_file.php" method="post">
    就可以了
      

  4.   

    恩,好了~谢谢你哦~~还有2L的~~
    O(∩_∩)O~
      

  5.   

    为甚么我上传的时候显示的是
    d:\upload\ 目录可写
    文件上载失败!$_FILES=Array
    (
        [file] => Array
            (
                [name] => 鏂板缓 鏂囨湰鏂囨。 (2).txt
                [type] => text/plain
                [tmp_name] => C:\wamp\tmp\phpD8.tmp
                [error] => 0
                [size] => 10
            ))
      

  6.   


    鏂板缓 鏂囨湰鏂囨。 (2).txt从错误信息看应该是上传文件名出现了错误导致错误,参考:$image_name = mktime().mt_rand(10000,100000).$_FILES['file']['name']; //图像的新名字
    move_uploaded_file($_FILES['file']['tmp_name'],iconv("UTF-8", "gb2312", BASEIMAGEPATH.'/'.$image_name)); //移动图像
      

  7.   

    名字的确改成英文就不会出现乱码了,但是还是文件上传失败?
    另外,我用5L的代码运行出的是9L的结果。。
    但是我把原来代码中的enctype="multipart/form_data" 改成enctype="multipart/form-data"后,再把<lable></lable>加上,结果反而变成下面这样:
    d:\upload\目录可写
    文件检验失败,可能遭受文件上传攻击!啊~~纠结啊纠结·~
    求教~~
      

  8.   

    我也遇到过同样的问题,上传文件总是失败,后来修改入下:
    <form action="upload.php" method="post"enctype="multipart/form-data">
    文件名:<br/><input type="text" name="name" value=""/><br/>
    上传的文件:<br/><input type="file" name="file" id="file" /><br />
    <input type="submit" name="submit" value="确定" />
    <input type="hidden"   name="MAX_FILE_SIZE"   value="500000000">
    </form>
    <?php
    if(isset($_POST["submit"]))
    {
        if(is_uploaded_file($_FILES['file']['tmp_name']))
        {
            if($_FILES['file']['type']!="application/pdf")
            {
                echo "<p>上传的文件必须是pdf格式的</p>";
            }
            else
            {
                $name=$_POST['name'];
                $result=move_uploaded_file($_FILES['file']['tmp_name'],"c:"."/$name.pdf");
                if($result)
                {
                    echo "<p>文件上传成功.</p>";
                }
                else
                {
                    echo "<p>文件上传失败.</p>";
                }
           }
        }
    }
    ?>
    这个文件可以上传Pdf格式的文件。
      

  9.   

    恩~谢谢楼上的·~
    我是菜鸟啊。。刚开始自学php,代码是按照书上的弄得,但是结果不对,所以想知道我原来的代码是哪里有问题呢?
    :<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>上传文件</title>
    </head>
    <body>
    <form enctype="multipart/form-data" action="upload_file.php" method="post"><input type="hidden" name="MAX_FILE_SIZE" value="32000"/><label for="file">上传文件:</label>
     <input name="sendfile" type="file"/><br/><pre> <input type="submit" value="上 传"/></pre>
    </form>
    </body>
    </html>
    <?php
    print "<pre>";
    $store_dir='d:\\upload\\'; //文件上传后存储在服务器的路径
    $uploadfile="$store_dir".basename($_FILES['sendfile']['name']); //上传文件的原始名字
    $uploadfile_tmp=$_FILES['sendfile']['name_tmp']; //上传文件的临时名字
    $err_msg=$_FILES['sendfile']['error']; //上传文件时产生的错误信息if ($err_msg){
    print "错误代码: $err_msg<br/>";
    }
    if (!is_writeable($store_dir)){ //检查上传的文件是否可写
    print "$store_dir 目录不可写\n";
    exit;
    }
    else{
    print "$store_dir 目录可写\n";
    }if(isset($_FILES['sendfile'])) { 
    if(is_uploaded_file($uploadfile_tmp)){ //检查上传的文件是否存在,如果存在则对其进行下一步操作
    print "文件检验成功\n";
    }
    else {
    print "文件检验失败,可能遭受文件上传攻击!";
    exit;
    }
    if (move_uploaded_file($uploadfile_tmp,$uploadfile)) { //对上传的合法文件,将其重命名并移动到服务器的上传文件夹中
    print "文件上传成功\n";
    }
    else{
    print "移动文件失败,可能遭受文件上传攻击!";
    exit;
    }
    print "文件上载成功!<br/>";
    }
    else{
    print "文件上载失败!<br/>";
    }
    print '$_FILES=';
    print_r($_FILES);
    print "</pre>";
    ?>
      

  10.   


    还是重新看看吧:
    PHP文件上传的原理及实现 利用php的文件函数来实现上传 
    这段代码分为两个文件,一个为upload.html,一个是upload.php upload.html 
    <form enctype="multipart/form-data" action="upload.php" method="post"> 
    <input type="hidden" name="max_file_size" value="100000"> 
    <input name="userfile" type="file">   
    <input type="submit" value="上传文件"> 
    </form> 其中,请注意
    这是一个标签,我们要实现文件的上传,必须指定为multipart/form-data,否则服务器将不知道要干什么。 值得注意的是文件upload.html中表单选项 MAX_FILE_SIZE 的隐藏值域,通过设置其Value(值)可以限制上载文件的大小。 MAX_FILE_SIZE 的值只是对浏览器的一个建议,实际上它可以被简单的绕过。因此不要把对浏览器的限制寄希望于该值。实际上,PHP 设置中的上传文件最大值,是不会失效的。但是最好还是在表单中加上 MAX_FILE_SIZE,因为它可以避免用户在花时间等待上传大文件之后才发现该文件太大了的麻烦。 upload.php 
    $f=&$HTTP_POST_FILES['Myfile']; 
    $dest_dir='uploads';//设定上传目录 
    $dest=$dest_dir.'/'.date("ymd")."_".$f['name'];//设置文件名为日期加上文件名避免重复 
    $r=move_uploaded_file($f['tmp_name'],$dest); 
    chmod($dest, 0755);//设定上传的文件的属性 
    或者 
    <?copy($_FILES[MyFile][tmp_name],$_FILES[MyFile][name]);?> 以上范例中 $_FILES 数组的内容如下所示。我们假设文件上传字段的名称为 userfile(名称可随意命名) 
    $_FILES['userfile']['name'] 客户端机器文件的原名称。 $_FILES['userfile']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如“image/gif”。 $_FILES['userfile']['size'] 已上传文件的大小,单位为字节。 $_FILES['userfile']['tmp_name'] 文件被上传后在服务端储存的临时文件名。 $_FILES['userfile']['error'] 和该文件上传相关的错误代码 值:0; 没有错误发生,文件上传成功。 值:1; 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。 值:2; 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。 值:3; 文件只有部分被上传。 值:4; 没有文件被上传。 [编辑]PHP上传文件涉及到的参数 PHP默认的上传限定是最大2M,想上传超过此设定的文件,需要调整PHP、apache等的一些参数. 下面,我们简要介绍一下PHP文件上传涉及到的一些参数: 
    file_uploads 是否允许通过HTTP上传文件的开关,默认为ON即是开 
    upload_tmp_dir upload_tmp_dir用来说明PHP上传的文件放置的临时目录,要想上传文件,得保证服务器没有关闭临时文件和有对文件夹的写权限,如果未指定则PHP使用系统默认值 
    upload_max_filesize 允许上传文件大小的最大值,默认为2M 
    post_max_size 控制在采用POST方法进行一次表单提交中PHP所能够接收的最大数据量。如果希望使用PHP文件上传功能,则需要将此值改为比upload_max_filesize要大 
    max_input_time 以秒为单位对通过POST、GET以及PUT方式接收数据时间进行限制。如果应用程序所运行环境处在低速链路上,则需要增加此值以适应接收数据所需的更多时间 
    memory_limit 为了避免正在运行的脚本大量使用系统可用内存,PHP允许定义内存使用限额。通过memory_limit变量来指定单个脚本程序可以使用的最大内存容量变量memory_limit的值应当适当大于post_max_size的值 
    max_execution_time max_execution_time设置了在强制终止脚本前PHP等待脚本执行完毕的时间,此时间以秒计算。当脚本进入了一个无限循环状态时此变量非常有用。然而,当存在一个需要很长时间完成的合法活动时(例如上传大型文件),这项功能也会导致操作失败。在这样的情况下必须考虑将此变量值增加,以避免PHP在脚本正在执行某些重要过程的时候将脚本关闭 
    对于linux主机,可能在/etc/httpd/conf.d/access.conf/下面里面还有php.conf 文件,这个文件可能会解决一些系统的文件大小限制问题 [编辑]利用discuz实现PHP大文件上传应用举例 
    论坛的附件功能当初设计的初衷并不是为了文件管理,由于服务器配置,php,网络等多方面因素,使得通过论坛上传文件并不是一个好方案。 
    对于确实需要改善论坛附件上传条件的朋友可以尝试将上面提及的参数在php.ini进行设置,以适应大文件上传的需要。同时别忘记在论坛的后台相应做附件限制的地方进行设置。 
    论坛主要有2个地方可以对附件上传的大小进行限制,级别从高到低依次为: 
    帖子相关---附件类型尺寸 用户组---附件相关 同时,下面提供一个配置指导,来源一些成功通过http上传大附件的朋友的提供,当然,由于大家的服务器配置情况以及网络情况不同,并不一定适用你的情况,可能很多地方需要参照修改: 
    打开php.ini, 
    参数 设置 说明 file_uploads on 是否允许通过HTTP上传文件的开关。默认为ON即是开 upload_tmp_dir -- 文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹 upload_max_filesize 8m 望文生意,即允许上传文件大小的最大值。默认为2M post_max_size 8m 指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M 说明 一般地,设置好上述四个参数后,在网络正常的情况下,上传<=8M的文件是不成问题 但如果要上传>8M的大体积文件,只设置上述四项还一定能行的通。除非你的网络真有100M/S的上传高速,否则你还得继续设置下面的参数。 max_execution_time 600 每个PHP页面运行的最大时间值(秒),默认30秒 max_input_time 600 每个PHP页面接收数据所需的最大时间,默认60秒 memory_limit 8m 每个PHP页面所吃掉的最大内存,默认8M 
    把上述参数修改后,在网络所允许的正常情况下,就可以上传大体积文件了 
    [编辑]论坛文件上传常见错误类型(不断总结中...) Warning: Unable to open '\\php2' for reading: Invalid argument in e:\user\web\larksoft.net\upload\upfile.php on line 10 是php的upload_tmp_dir的原因,所指定的目录必须可读可写 
    Parse error: parse error in c:\program files\apache group\apache\htdocs\mdweb\ftpfile\upload.php on line 14 Parse error一般都是语句的问题,比如象“;”,“'”,“)”等等的匹配问题 
      

  11.   

    $_FILES['userfile']['name'] 客户端机器文件的原名称。 $_FILES['userfile']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如“image/gif”。 $_FILES['userfile']['size'] 已上传文件的大小,单位为字节。 $_FILES['userfile']['tmp_name'] 文件被上传后在服务端储存的临时文件名。 $_FILES['userfile']['error'] 和该文件上传相关的错误代码 值:0; 没有错误发生,文件上传成功。 值:1; 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。 值:2; 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。 值:3; 文件只有部分被上传。 值:4; 没有文件被上传。  
      

  12.   

    介绍一个很方便的上传类吧,PHP多文件上传类推荐