Guzzle 6:使用数组数据上传文件

时间:2015-12-30 17:15:11

标签: php arrays guzzle6

我必须用文件发送数组数据。只使用数据正常工作:

$client->post('http://xxx/', [
    'form_params' => [
        [
            'data' => ['id' => 1234, 'name' => 'nombre'],
            'valid' => true
        ]
    ]
]);

但由于我不能将“form_params”用于“multipart”,如何发送带有数组和布尔数据的文件?

我试过了:

$client->post('http://xxx/', [
    'multipart' => [
        [
            'name'     => 'myfile',
            'contents' => fopen('my_file.txt', 'r'),
        ],
        [
            'name'     => 'data',
            'contents' => ['id' => 1234, 'name' => 'nombre'],
        ]
        [
            'name'     => 'valid',
            'contents' => true,
        ]
    ],
]);

但是我收到错误,因为“contents”不接受布尔值或数组值。

我需要一些帮助。

谢谢

更新: 我无法解决问题,最后我不得不使用一个不太好的解决方案,包括作为查询字符串的表单字段参数和仅使用Multipart。类似的东西:

$client->post('http://xxx?id=1234&name=nombre', [
'multipart' => [
    [
        'name'     => 'myfile',
        'contents' => fopen('my_file.txt', 'r'),
    ],
],

]);

3 个答案:

答案 0 :(得分:4)

根据Guzzle文件:

  

multipart的值是一个关联数组的数组   包含以下键值对:

     
      
  • name :( string,required)表单字段名称
  •   
  • contents:(StreamInterface / resource / string,required)表单元素中使用的数据。
  •   
  • headers:(array)与表单元素一起使用的自定义标头的可选关联数组。
  •   
  • filename:(string)要作为文件名发送的可选字符串。
  •   

所以看起来它只接受内容的字符串(直接或作为流)。他们可能的理性是,由于它是一个多部分形式,你可以分别发送每个数据点,如下所示......

$client->post('http://xxx/', [
    'multipart' => [
        [
            'name'     => 'myfile',
            'contents' => fopen('my_file.txt', 'r'),
        ],
        [
            'name'     => 'id',
            'contents' => '1234',
        ],
        [
            'name'     => 'name',
            'contents' => 'nombre',
        ],
        [
            'name'     => 'valid',
            'contents' => 'true',
        ]
    ],
]);

在不知道如何解析数据的情况下,我无法确定这是一个可行的选项,但由于它接受自定义标头,您可以将其作为JSON数组(以字符串形式)发送,然后设置内容类型:

$client->post('http://xxx/', [
    'multipart' => [
        [
            'name'     => 'myfile',
            'contents' => fopen('my_file.txt', 'r'),
        ],
        [
            'name'     => 'data',
            'contents' => '{"id":1234, "name":"nombre"}',
            'headers'  => ['Content-Type' => 'text/x-json']
        ],
        [
            'name'     => 'valid',
            'contents' => 'true',
        ]
    ],
]);

另一种选择是直接使用cURL,但我确定你想避免使用它,因为你使用的是Guzzle。

<强>更新

这不是我亲自测试过的东西,但这是你可以尝试的另一件事......(我应该首先想到这一点)。

$client->post('http://xxx/', [
    'multipart' => [
        [
            'name'     => 'myfile',
            'contents' => fopen('my_file.txt', 'r'),
        ],
        [
            'name'     => 'data',
            'contents' => 'id=1234&name=nombre',
            'headers'  => ['Content-Type' => 'text/plain; charset=ISO-8859-1']
        ],
        [
            'name'     => 'valid',
            'contents' => true,
        ]
    ],
]);

答案 1 :(得分:2)

可以选择通过Guzzle将上传文件和数组数据一起发送,但改变后的形式:

$client->post('http://xxx/', [
    'multipart' => [
        [
            'name'     => 'myfile',
            'contents' => fopen('my_file.txt', 'r'),
        ],
        [
            'name'     => 'data[0][id]',
            'contents' => 1234,
        ],
        [
            'name'     => 'data[0][name]',
            'contents' => 'nombre',
        ],
        [
            'name'     => 'data[1][id]',
            'contents' => 2222,
        ],
        [
            'name'     => 'data[1][name]',
            'contents' => 'nombre2',
        ],
        [
            'name'     => 'valid',
            'contents' => true,
        ]
    ],
]);

另一方面,您可以使用$_POST['data']获取数据,然后执行foreach:

foreach ($_POST['data'] as $data) {
    echo "Id: ".$data['id'];
    echo "Name: ".$data['name'];
}

答案 2 :(得分:0)

您可以使用一种递归方法来获取数据数组并准备多部分数组:

ActionEvent