Получить файл через 'php://input'

109
22 января 2021, 02:10

Отправляю файлы (избражение, изображние в архиве) на сервер POST-запросом. Файл приходит(данные появляются в $_FILES).

Но принять файлы нужно через функцию:

$data = file_get_contents('php://input');

Но функция ничего не возвращает.

Данный участок кода встречается в файлах обработчиках выгрузки из 1С, принимает архив который отправляет 1С. И там он успешно работает. Но в моём случает работать отказывается.

Answer 1

В мануале об этом сказано:

php://input недоступен с типом содержимого enctype="multipart/form-data"

Обойти можно используя другой content-type, но это значит, что отправку надо будет делать самому (стандартная форма не годится).

UPD Пример отправки из js

index.php:

<?php
// php -S 127.0.0.1:8080
$method = $_SERVER['REQUEST_METHOD']?? null;
if ($method === 'POST') {
    $body = file_get_contents('php://input');
    if ( ! empty($body)) {
        file_put_contents(__DIR__ . '/file', $body);
        http_response_code(201);
        exit(0);
    } else {
        http_response_code(400);
        exit(1);
    }
} else {
    require __DIR__ . '/form.phtml';
}

form.phtml:

<form id="form" action="" method="POST">
    <input type="file" name="file">
    <button type="submit">Submit</button>
</form>
<script>
    var form = document.querySelector('#form');
    form.addEventListener('submit', function(event) {
        event.preventDefault();
        var fileInput = event.target.querySelector('input[type="file"]');
        var file = fileInput.files[0];
        if (file) {
            var rq = new XMLHttpRequest();
            rq.open(
                event.target.getAttribute('method'),
                event.target.getAttribute('action')
            );
            rq.onload = function() {
                alert('Ok');
            };
            rq.onerror = function() {
                alert('Fail');
            };
            rq.send(file);
        } else {
            alert('Не выбран файл');
        }
    });
</script>
Answer 2

Это должно сработать.

$fp= fopen("1.txt","w"); 
if (fwrite($fp, file_get_contents('php://input'))) { 
    echo 'Success';
} else { 
    echo 'Error';
}  
fclose($fp);

Но если внимательно почитать документацию, то у php://input есть ограничение по директиве allow_url_include. Подробнее: здесь

READ ALSO
Правильная загрузка больших файлов, PHP

Правильная загрузка больших файлов, PHP

Всем приветЗадался вопросом, как правильно отдавать пользователю на загрузку большой файл? Использую Laravel, при стандартном подходе response()->download()...

83
Использование нескольких @OneToOne аннотаций Hibernate

Использование нескольких @OneToOne аннотаций Hibernate

У меня есть 3 сущности: Customer, User и VerificationEmail

86
java Spring сервер не получает POST и PUT запросы из android

java Spring сервер не получает POST и PUT запросы из android

У меня есть простой север на Spring`е, что должен обрабатывать GET, PUT и POST запросы, и работать с БД соответственноС GET никаких проблем нет, и приложение...

104
Пробел в первой ячейке Excel (CSV)

Пробел в первой ячейке Excel (CSV)

При генерации csv файла и последующем его открытии в excel получаю ошибкуРешить ее удалось добавив в первую ячейку первым символом пробел

100