swoole_http_client->addFile

添加POST文件。

function swoole_http_client->addFile(string $path, string $name, string $filename = null,
    string $mimeType = null, int $offset = 0, int $length = 0)
  • $path 文件的路径,必选参数,不能为空文件或者不存在的文件
  • $name 表单的名称,必选参数,FILES参数中的key
  • $filename 文件名称,可选参数,默认为basename($path)
  • $mimeType 文件的MIME格式,可选参数,底层会根据文件的扩展名自动推断
  • $offset 上传文件的偏移量,可以指定从文件的中间部分开始传输数据。此特性可用于支持断点续传。
  • $length 发送数据的尺寸,默认为整个文件的尺寸

使用addFile会自动将POST的Content-Type将变更为form-dataaddFile底层基于sendfile,可支持异步发送超大文件。

addFile在1.8.9或更高版本可用
$offset, $length 参数在1.9.11或更高版本可用

使用示例

<?php
$cli = new swoole_http_client('127.0.0.1', 80);
//post request
$cli->setHeaders(['User-Agent' => "swoole"]);
$cli->addFile(__DIR__.'/post.data', 'post');
$cli->addFile(dirname(__DIR__).'/test.jpg', 'debug');
$cli->post('/dump2.php', array("xxx" => 'abc', 'x2' => 'rango'), function ($cli) {
    echo $cli->body;
});


  • 猫空

    想直接传文件数据要怎么做,比如从网络直接获取到图片的流,然后还必须要保存到本地一次才可以吗?

  • 活着

    你是猪吗? 传统的key=value 加路径啊

  • Sin

    楼上垃圾

  • sinpe

    客户端centos6.9、php7.1.21使用swoole_http_client通过post数据和上传文件到服务端:

    $data = [
        'p1' => 1,
        'p2' => 2,
        'groups' => [20,30]
    ];
    
    $cli->addFile('/home/test/photo.jpg', 'photo');
    
    $cli->post('/index.php', $data, function ($cli) {
        echo $cli->body;
    });
    

    服务端centos6.9、php7.1.21、apache2.2.15普通web应用:index.php

    var_export($_POST);
    exit;
    

    结果打出来的数据是:

    array(
        'p1' => 1,
        'p2' => 2,
        'groups' => 'Array'
    )
    

    但是我期望的是:

    array(
        'p1' => 1,
        'p2' => 2,
        'groups' => array(20,30)
    )   
    

    以上,请问是哪里使用存在问题,还是swoole_http_client本身问题?

    如果不调用addFile文件则结果是正常的,swoole文档中有说一般post是application/x-www-form-urlencoded,使用addFile后会被转成form-data,是不是swoole转的时候有问题?