Я искал способ отправить запрос на публикацию с несколькими файлами, используя curl.
Но все примеры кода делали не так, как браузер.
Глобал $ _ FILES не содержит обычного массива, описанного в PHP.
Теперь я выяснил, почему: смещения, где отсутствует [i]
см. http://php.net/manual/de/class.curlfile.php#121971
Без «трюка» вы получите другой результат в $ _ FILES
[
'foo_bar' => [
'name' => 'path/to/my_file_1.png',
'type' => 'application/octet-stream',
'tmp_name' => '/tmp/phpim24ij',
'error' => 0,
'size' => 123,
],
]
или
[
'foo_bar_1' => [
'name' => 'path/to/my_file_1.png',
'type' => 'application/octet-stream',
'tmp_name' => '/tmp/phpim24ij',
'error' => 0,
'size' => 123,
],
'foo_bar_2' => [
'name' => 'path/to/my_file_1.png',
'type' => 'application/octet-stream',
'tmp_name' => '/tmp/phpim24ij',
'error' => 0,
'size' => 123,
],
]
Но это не то, что мы хотим.
То, что мы хотим - это обычный $ _ FILES массив, подобный
[
'foo_bar' => [
'name' => [
0 => 'path/to/my_file_1.png',
1 => 'path/to/my_file_2.png',
],
'type' => [
0 => 'application/octet-stream',
1 => 'application/octet-stream',
],
'tmp_name' => [
0 => '/tmp/phpSPAjHW',
1 => '/tmp/php0fOmK4',
],
'error' => [
0 => 0,
1 => 0,
],
'size' => [
0 => 123,
1 => 234,
],
],
]
Вот код:
* +1032 * Пример: * 1 033 *
$url = "http://api-foo.com/bar/baz";
$uploadFormInputFieldName = 'foo_bar';
$files = [
'path/to/my_file_1.png',
'path/to/my_file_2.png',
// ...
];
$postData = [];
$i = 0;
foreach ($files as $file) {
if (function_exists('curl_file_create')) {
$file = curl_file_create($file);
} else {
$file = '@' . realpath($file);
}
// here is the thing: post data needs to be $posData["foo_bar[0]"], $posData["foo_bar[1]"], ...
$postData["{$uploadFormInputFieldName}[{$i}]"] = $file;
$i++;
}
$httpClient = $this->getHttpClient($url); // get your client
$httpClient->setHeader('Content-Type', 'multipart/form-data');
$response = $httpClient->post($postData); // send post request