【问题标题】:Upload multiple files and post vars with fsockopen使用 fsockopen 上传多个文件并发布变量
【发布时间】:2013-05-19 22:27:23
【问题描述】:

我希望使用 fsockopen 在 http 请求中发送多个文件和发布变量。

已经想出了这段代码,但我不知道如何发送带有文件的帖子变量!?已取消注释构建发布数据查询的行,但不知道如何将其放入请求中!? :(

index.php

$post_vars = [
    'label' => 'description of the upload'
];

$files = [
    'upload_file_1.txt',
    'upload_file_2.txt'
];

try{
    $boundary = sha1(1);
    $crlf = "\r\n";
    $body = '';

    foreach($files as $file){
        $finfo = new \finfo(FILEINFO_MIME);
        $mimetype = $finfo->file($file);

        $file_contents = quoted_printable_encode(file_get_contents($file));

        $body .= '--'.$boundary.$crlf
            .'Content-Disposition: form-data; name="files[]"; filename="'.basename($file).'"'.$crlf
            .'Content-Type: '.$mimetype.$crlf
            .'Content-Length: '.strlen($file_contents).$crlf
            .'Content-Type: application/octet-stream'.$crlf.$crlf
            .$file_contents.$crlf;
    }

    $body .= '--'.$boundary.'--';

    //$post_data = http_build_query($post_vars);

    $response = '';
    if($fp = fsockopen('localhost', 80, $errno, $errstr, 20)){
        $write = "POST /api_test/filepost/post.php HTTP/1.1\r\n"
            ."Host: localhost\r\n"
            ."Content-type: multipart/form-data; boundary=".$boundary."\r\n"
            ."Content-Length: ".strlen($body)."\r\n"
            ."Connection: Close\r\n\r\n"
            .$body;
        fwrite($fp, $write);

        echo "-------------------- REQUEST START --------------------\n".$write."\n-------------------- REQUEST END --------------------\n\n\n";

        while($line = fgets($fp)){
            if($line !== false){
                $response .= $line;
            }
        }

        fclose($fp);

        echo "-------------------- RESPONSE START --------------------\n".$response."\n-------------------- RESPONSE END --------------------\n\n";
    }
    else{
        throw new Exception("$errstr ($errno)");
    }
}
catch(Exception $e){
    echo 'Error: '.$e->getMessage();
}

post.php

echo "get\n";
print_r($_GET);

echo "post\n";
print_r($_POST);

echo "files\n";
print_r($_FILES);

输出

-------------------- REQUEST START --------------------
POST /api_test/filepost/post.php HTTP/1.1
Host: localhost
Content-type: multipart/form-data; boundary=356a192b7913b04c54574d18c28d46e6395428ab
Content-Length: 540
Connection: Close

--356a192b7913b04c54574d18c28d46e6395428ab
Content-Disposition: form-data; name="files[]"; filename="upload_file_1.txt"
Content-Type: text/plain; charset=us-ascii
Content-Length: 18
Content-Type: application/octet-stream

contents of file 1
--356a192b7913b04c54574d18c28d46e6395428ab
Content-Disposition: form-data; name="files[]"; filename="upload_file_2.txt"
Content-Type: text/plain; charset=us-ascii
Content-Length: 18
Content-Type: application/octet-stream

contents of file 2
--356a192b7913b04c54574d18c28d46e6395428ab--
-------------------- REQUEST END --------------------


-------------------- RESPONSE START --------------------
HTTP/1.1 200 OK
Date: Mon, 20 May 2013 08:46:21 GMT
Server: Apache/2.2.22 (Win32) PHP/5.4.3
X-Powered-By: PHP/5.4.3
Content-Length: 803
Connection: close
Content-Type: text/plain

get
Array
(
)
post
Array
(
)
files
Array
(
    [files] => Array
        (
            [name] => Array
                (
                    [0] => upload_file_1.txt
                    [1] => upload_file_2.txt
                )

            [type] => Array
                (
                    [0] => text/plain
                    [1] => text/plain
                )

            [tmp_name] => Array
                (
                    [0] => C:\wamp\tmp\php1827.tmp
                    [1] => C:\wamp\tmp\php1828.tmp
                )

            [error] => Array
                (
                    [0] => 0
                    [1] => 0
                )

            [size] => Array
                (
                    [0] => 18
                    [1] => 18
                )

        )

)

-------------------- RESPONSE END --------------------

【问题讨论】:

    标签: php fsockopen


    【解决方案1】:

    index.php

    $post_vars = [
        'label' => 'description of the upload'
    ];
    
    $files = [
        'upload_file_1.txt',
        'upload_file_2.txt'
    ];
    
    try{
        $boundary = sha1(1);
        $crlf = "\r\n";
        $body = '';
    
        foreach($post_vars as $key => $value){
            $body .= '--'.$boundary.$crlf
                .'Content-Disposition: form-data; name="'.$key.'"'.$crlf
                .'Content-Length: '.strlen($value).$crlf.$crlf
                .$value.$crlf;
        }
    
        foreach($files as $file){
            $finfo = new \finfo(FILEINFO_MIME);
            $mimetype = $finfo->file($file);
    
            $file_contents = quoted_printable_encode(file_get_contents($file));
    
            $body .= '--'.$boundary.$crlf
                .'Content-Disposition: form-data; name="files[]"; filename="'.basename($file).'"'.$crlf
                .'Content-Type: '.$mimetype.$crlf
                .'Content-Length: '.strlen($file_contents).$crlf
                .'Content-Type: application/octet-stream'.$crlf.$crlf
                .$file_contents.$crlf;
        }
    
        $body .= '--'.$boundary.'--';
    
        //$post_data = http_build_query($post_vars);
    
        $response = '';
        if($fp = fsockopen('localhost', 80, $errno, $errstr, 20)){
            $write = "POST /api_test/filepost/post.php HTTP/1.1\r\n"
                ."Host: localhost\r\n"
                ."Content-type: multipart/form-data; boundary=".$boundary."\r\n"
                ."Content-Length: ".strlen($body)."\r\n"
                ."Connection: Close\r\n\r\n"
                .$body;
            fwrite($fp, $write);
    
            echo "-------------------- REQUEST START --------------------\n".$write."\n-------------------- REQUEST END --------------------\n\n\n";
    
            while($line = fgets($fp)){
                if($line !== false){
                    $response .= $line;
                }
            }
    
            fclose($fp);
    
            echo "-------------------- RESPONSE START --------------------\n".$response."\n-------------------- RESPONSE END --------------------\n\n";
        }
        else{
            throw new Exception("$errstr ($errno)");
        }
    }
    catch(Exception $e){
        echo 'Error: '.$e->getMessage();
    }
    

    post.php

    echo "get\n";
    print_r($_GET);
    
    echo "post\n";
    print_r($_POST);
    
    echo "files\n";
    print_r($_FILES);
    

    输出

    -------------------- REQUEST START --------------------
    POST /api_test/filepost/post.php HTTP/1.1
    Host: localhost
    Content-type: multipart/form-data; boundary=356a192b7913b04c54574d18c28d46e6395428ab
    Content-Length: 679
    Connection: Close
    
    --356a192b7913b04c54574d18c28d46e6395428ab
    Content-Disposition: form-data; name="label"
    Content-Length: 25
    
    description of the upload
    --356a192b7913b04c54574d18c28d46e6395428ab
    Content-Disposition: form-data; name="files[]"; filename="upload_file_1.txt"
    Content-Type: text/plain; charset=us-ascii
    Content-Length: 18
    Content-Type: application/octet-stream
    
    contents of file 1
    --356a192b7913b04c54574d18c28d46e6395428ab
    Content-Disposition: form-data; name="files[]"; filename="upload_file_2.txt"
    Content-Type: text/plain; charset=us-ascii
    Content-Length: 18
    Content-Type: application/octet-stream
    
    contents of file 2
    --356a192b7913b04c54574d18c28d46e6395428ab--
    -------------------- REQUEST END --------------------
    
    
    -------------------- RESPONSE START --------------------
    HTTP/1.1 200 OK
    Date: Mon, 20 May 2013 09:07:58 GMT
    Server: Apache/2.2.22 (Win32) PHP/5.4.3
    X-Powered-By: PHP/5.4.3
    Content-Length: 844
    Connection: close
    Content-Type: text/plain
    
    get
    Array
    (
    )
    post
    Array
    (
        [label] => description of the upload
    )
    files
    Array
    (
        [files] => Array
            (
                [name] => Array
                    (
                        [0] => upload_file_1.txt
                        [1] => upload_file_2.txt
                    )
    
                [type] => Array
                    (
                        [0] => text/plain
                        [1] => text/plain
                    )
    
                [tmp_name] => Array
                    (
                        [0] => C:\wamp\tmp\phpE35D.tmp
                        [1] => C:\wamp\tmp\phpE35E.tmp
                    )
    
                [error] => Array
                    (
                        [0] => 0
                        [1] => 0
                    )
    
                [size] => Array
                    (
                        [0] => 18
                        [1] => 18
                    )
    
            )
    
    )
    
    -------------------- RESPONSE END --------------------
    

    【讨论】:

    • 为什么每个块有两次 Content-Type 字段?
    【解决方案2】:

    试试这个:

    .$file_contents.$crlf.$crlf; -> .$file_contents.$crlf;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-27
      • 2016-01-04
      • 2016-04-17
      • 1970-01-01
      • 2018-01-25
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多