Непонятная замена ключа в массиве $_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 шт):
Проблема чисто 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 за наводку.