ajax.onreadystatechange = function() 
    { 
    //如果执行状态成功,那么就把返回信息写到指定的层里 
        if (ajax.readyState == 4 && ajax.status == 200) 
        { 
            document.getElementById("msg").innerHTML = ajax.responseText; 
        } 
    } 

解决方案 »

  1.   

    ajax是不能传递文件的。
    文件只能以表单形式提交。
      

  2.   

    而且出于安全考虑你用javascript在firefox或ie7(不过ie7通过设置可以,但你不能这样要求客户)中是取不到文件的路径的。
      

  3.   

    因此你的var url="validate.php?picfile=" + picfile;是没有用处的。
      

  4.   

      ajax.onreadystatechange = function() 
        { 
        //如果执行状态成功,那么就把返回信息写到指定的层里 
            if (ajax.readyState == 4 && ajax.status == 200) 
            { 
                msg.innerHTML = ajax.responseText; 
                //这里指定焦点
                  document.getElementById('你要给焦点的html的元素的id').focus();
            } 
        } 
      

  5.   

    var url="validate.php?picfile=" + picfile;有用啊!我测试了!完全在php那段可以扑获到值!
      

  6.   

    谢谢!jakey9826 师哥!那么var url="validate.php?picfile=" + escape(picfile); 我这个问题能帮忙解决一下吗!我用的XP系统!在C:\Documents and Settings\All Users\Documents\My Pictures\示例图片这里找的图片上传的!昨天有位师哥告诉我图片有问题!但是我试了其他图片也不行!还是我在PHP里写的unescape()方法有问题那?
      

  7.   


    这个只是ajax的最基本应用,能得到值,但不一定能得到文件的大小
      

  8.   

    我在php里
    $picfile=$_REQUEST["picfile"]; 
    echo filesize($picfile)." <br>"; 这样写!确实能得到大小!
      

  9.   

    php里没有unescape()这个函数!不太明白你的方法.
    你直接传个客户端的文件名过去就能知道这个文件的大小了?
      

  10.   

    是啊!如果我改成这样
    $picfile=$_FILES['picfile'];
    echo picfile['size'];就不行了!
      

  11.   

    这么传会是返回错误!
    Warning: filesize() [function.filesize]: stat failed for C:\Documents and Settings\kuno6\%u684C%u9762\%u4E0A%u4F20%u6D4B%u8BD5%u6587%u4EF6\Sunset.jpg in C:\wamp\www\AjaxPHP\validate.php on line 4 
      

  12.   

    我明白了!是filesize()的错误!是filesize这个方法无法扑获到C:\Documents and Settings\kuno6\%u684C%u9762\%u4E0A%u4F20%u6D4B%u8BD5%u6587%u4EF6\Sunset.jpg 这个路径
      

  13.   

    1 其实在你的上一个帖子里我就已经告诉你了.
    ajax是不能直接上传文件的,但是你没有重视,呵呵!
    既然ajax不能直接上传文件,所以$_FILES数组是空的,filesize()也不能直接读取客户端的文件.
    所以在一开始你的思路就是错的.直到现在你还没有意识到.2 如果想让ajax能够上传文件,就需要模拟表单提交,常见的处理方式就是利用动态iframe来代替传统的表单提交.
     jquery ajaxfileupload就是利用这种方式实现的,你可以直接用ajaxfileupload.当然你也可以将它哪块处理方法给提出来,自己模仿实现.言尽于此,能理解多少就看楼主了!
      

  14.   

    var url="validate.php?picfile=" + picfile; 没用,我指的是firefox和ie7。ie6还是可以的,看提示要仔细。firefox和ie7取不到路径,只能得到文件名,和文件大小。何必去ajax模拟呢?多此一举。在表单的提交按钮中使用
    <input onclick="startProgress(); return true;" type="submit" value="上传"/>
    就可以直接调用ajax了。(startProgress(); 就是调用的函数)
      

  15.   

    你可真牛!
    建议写个demo程序来,大家学习一下.
      

  16.   

    17楼:
    想问一下,你按钮提交是在ajax之前还是在ajax之后.
    如果在之前,ajax还是不能获取上传的文件,因为表单并没有真正的提交.
    如果在之后,页面都提交了,还调用ajax有何用?或者有别的方法,真的想学习一下!
      

  17.   

    这是版主唠叨写的php版escape和unescape函数:function escape($str) {
      preg_match_all("/[€-ÿ].|[-]+/",$str,$r);
      $ar = $r[0];
      foreach($ar as $k=>$v) {
        if(ord($v[0]) < 128)
          $ar[$k] = rawurlencode($v);
        else
          $ar[$k] = "%u".bin2hex(iconv("GB2312","UCS-2",$v));
      }
      return join("",$ar);
    }function unescape($str) {
      $str = rawurldecode($str);
      preg_match_all("/(?:%u.{4})|.+/",$str,$r);
      $ar = $r[0];
      foreach($ar as $k=>$v) {
        if(substr($v,0,2) == "%u" && strlen($v) == 6)
          $ar[$k] = iconv("UCS-2","GB2312",pack("H4",substr($v,-4)));
      }
      return join("",$ar);
    }
      

  18.   

    向jakey9826师哥学习!我学习Jquery ajaxfileupload去了!不会的我在问!呵呵~
      

  19.   

    回20楼:
    php制作实时上传进度就是使用这方法,有兴趣了解的话看
    http://www.ibm.com/developerworks/cn/opensource/os-php-v525/
    PHP V5.2 中的新增功能,第 5 部分: 跟踪文件上传进度
      

  20.   

    ajax是不可以直接上传文件的
    jakey9826
    说的对
    如果上传文件可以模拟提交表单来上传文件
    wangtiantian23
    开始的时候看到可以实现是因为你本地下和客户端同一目录下有同名文件,所以可以找到文件。
    如果不存在就会出找不到文件的错误。