我必须用文件发送数组数据。只使用数据正常工作:
$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'),
],
],
]);
答案 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