Непонятная замена ключа в массиве $_FILES

На сервер отправляется POST запрос с файлом:

curl --request POST 'http://localhost:8100' --form 'File 1.txt=@"./file.txt"'

Первой строчкой в скрипте выводится дамп $_FILES:

die(var_dump($_FILES));

Содержимое:

array(1) {
  ["File_1_txt"]=>
  array(5) {
    ["name"]=>
    string(8) "file.txt"
    ["type"]=>
    string(10) "text/plain"
    ["tmp_name"]=>
    string(14) "/tmp/phpWwGevM"
    ["error"]=>
    int(0)
    ["size"]=>
    int(0)
  }

Вопрос: почему в качестве ключа отправляется File 1.txt, а в массиве $_FILES это становится File_1_txt и как это можно исправить?

PS. Если запустить с опцией --trace (curl --trace - --request POST 'http://localhost:8100' --form 'File 1.txt=@"./file.txt"'), лог такой:

...
0020: 33 36 30 63 31 62 34 33 62 63 0d 0a 43 6f 6e 74 360c1b43bc..Cont
0030: 65 6e 74 2d 44 69 73 70 6f 73 69 74 69 6f 6e 3a ent-Disposition:
0040: 20 66 6f 72 6d 2d 64 61 74 61 3b 20 6e 61 6d 65  form-data; name
0050: 3d 22 46 69 6c 65 20 31 2e 74 78 74 22 3b 20 66 ="File 1.txt"; f
0060: 69 6c 65 6e 61 6d 65 3d 22 66 69 6c 65 2e 74 78 ilename="file.tx
0070: 74 22 0d 0a 43 6f 6e 74 65 6e 74 2d 54 79 70 65 t"..Content-Type
...

То есть однозначно отправляется "File 1.txt", а PHP на этапе парсинга запроса производит замену входных данных.

PS2.

То же самое для curl --request POST 'http://localhost:8100' --data-urlencode 'foo bar=baz'

var_dump(file_get_contents('php://input'));
var_dump($_POST);
die;

Выводит

string(11) "foo bar=baz"
array(1) {
  ["foo_bar"]=>
  string(3) "baz"
}

Ответы (1 шт):

Автор решения: Total Pusher

Проблема чисто PHP из-за легаси-кода.

Была функция import_request_variables которая создает из суперглобальных массивов POST/GET/Cookie глобальные переменные. Но переменные в PHP не могут содержать пробелы, точки и другие символы. Поэтому происходит их замена на _.

Функции уже нет, а такое поведение осталось.

Точки и пробелы в именах переменных преобразуется в знаки подчёркивания. Например, <input name="a.b" /> станет $_REQUEST["a_b"].

Проблема решается оборачиванием в массив: foo bar=baz => data[foo bar]=baz.

https://stackoverflow.com/questions/17092398/post-spaces-converted-in-underscores

Спасибо @splash58 за наводку.

→ Ссылка