$boundary   = md5(time());
$postStr  = "";
$postStr .="--".$boundary."\r\n";
$postStr .="Content-Disposition: form-data; name=\"uptxt[]\"; filename=\"index_1.html\"\r\n";
$postStr .="Content-Type: text/html\r\n\r\n";
$postStr .=$uploadFile."\r\n"; #这里是部分文件内容
$postStr .="--".$boundary."\r\n";
$postStr .="Content-Disposition: form-data; name=\"uptxt[]\"; filename=\"index_1.html\"\r\n";
$postStr .="Content-Type: text/html\r\n\r\n";改为$postStr .="Content-Disposition: form-data; name=\"uptxt[]\"; filename=\"index_1.html\""; //删除\r\n
$postStr .="Content-Type: text/html"; //删除\r\n之后还是可以上传成功 
而且$postStr .="Content-Disposition: form-data; name=\"uptxt[]\"; filename=\"index_1.html\"\r\n";
$postStr .="Content-Type: text/html\r\n\r\n";改为$postStr .='Content-Disposition: form-data; name="uptxt[]"; filename="index_1.html"\r\n';//改为单引号,\r\n不再转义
$postStr .='Content-Type: text/html\r\n\r\n'; //改为单引号,\r\n不再转义也可以上传成功,求解

解决方案 »

  1.   

    协议就是要来遵守的,如果不遵守,后果的不可预知的。
    你能请求成功,但是会让web服务器解析http时乱套,/号和换行符都是重要的符号标志。比方说现在boundary块如下,注意Content-type:text~html,去除\r\n且把/换成~
    $boundary   = md5(time());
    $postStr  = ""; 
    $postStr .="--".$boundary."\r\n";
    $postStr .="Content-Disposition: form-data; name=\"uptxt[]\"; filename=\"index_1.html\"";
    $postStr .="Content-Type: text~html";                                                                                                       
    $postStr .="123\r\n"; #这里是部分文件内容
    $postStr .="--".$boundary."\r\n";那么你猜服务器怎么解析的?
    它找到第一个出现\r\n\r\n结束的位置,以找到文件名,如果没有就一直解析到尾
    所以$_FILES结果变成了
    Array
    (
        [uptxt] => Array
            (
                [name] => Array
                    (
                        [0] => index_1.html"Content-Type: text~html123--91805707cf4d3a1cf19b6c42446b66a4
                    )            [type] => Array
                    (
                        [0] => 
                    )            [tmp_name] => Array
                    (
                        [0] => 
                    )            [error] => Array
                    (
                        [0] => 3
                    )            [size] => Array
                    (
                        [0] => 0
                    )        ))
    boundary串都作为文件名一部分了,所以我们预想的提交的文件内容也没解析到。
      

  2.   

    你说的去掉\r\n,还有双引号转单引号,我本地试过都不行的,也在预料之中。
    你说你那边居然可以,就有点出乎意料了,我也搞不懂了,不管如何,按照协议规范来构建http请求就好了。
      

  3.   

    不是用curl吗?网上找了一段是这样的:<?php
    $url  = 'http://www.myheritage.cn/FP/Company/tryFaceRecognition.php';//target url
     
    $fields['file'] = '@'.'C:\Users\lzyy\Desktop\3431821560_5e18c02221.jpg';
    $fields['lang'] = 'ZH';
    $fields['morph'] = '1';
    $fields['popup'] = 'PJSLVMMT';
    $fields['loadMethod'] = 'myFiles';
     
    $ch = curl_init();
     
    curl_setopt($ch, CURLOPT_URL, $url );
    curl_setopt($ch, CURLOPT_POST, 1 );
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fields );
    //curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($ch, CURLOPT_REFERER, "http://www.myheritage.cn/");
    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);//get redirect content
     
    curl_exec( $ch );
    //$rs = curl_exec($ch);
     
    if ($error = curl_error($ch) ) {
              die($error);
    }
    curl_close($ch);
    //print_r(htmlspecialchars($rs));
    echo 'ok';
    ?>http://snipplr.com/view/13990/curl/http://www.baidu.com/s?wd=curl+upload+file&rsv_bp=0&rsv_spt=3&inputT=4344