$_FILES пуст после загрузки AJAX

Я разрабатываю простой скрипт для загрузки файла через AJAX, но после отправки формы переменная $_FILES полностью пуста, хотя файл существует в php://input, но нет простого способа извлечь только файл. Кто-нибудь знает причину и/или решение этой проблемы?

Я проверил все распространенные решения. enctype="мультипарт/форма-данные" права на временную папку закрытие тегов формы двойные кавычки и вывод файла-ввода в JS

Ничто не решило мою проблему.

КРАСНЫЙ Это НЕ jquery, и я не нашел дубликата за 24 часа. Поэтому, пожалуйста, не отмечайте как дубликат, если вы не уверены, что это один.

HTML

<form action = "upload.php" method = "POST" enctype = "multipart/form-data" id = "testf">
<input type = "file" name = "file" accept = ".jpg">
<input type = "submit" value = "Skicka">
</form>

JavaScript

let data = document.querySelector("#testf");
data.onsubmit = function() {
    var http = new XMLHttpRequest();
    http.open("upload.php", data.action);
    http.onreadystatechange = function () {
        console.info(http.response);
    }
    http.setRequestHeader("Content-type", data.enctype);
    http.send(new FormData(data));
    event.preventDefault();
    return false;
}

PHP

<?php
var_dump($_FILES);
?>

Это должно распечатать содержимое моего файла, но

array(0) {}

это все, что я получаю. Полезная нагрузка запроса:

------WebKitFormBoundaryZVGq8suqFUUSFDtW
Content-Disposition: form-data; name = "file"; filename = "david.jpg"
Content-Type: image/jpeg


------WebKitFormBoundaryZVGq8suqFUUSFDtW--

Возможный дубликат Загрузка файла jQuery Ajax

bassxzero 04.07.2019 00:04

ОП не использует jQuery.

showdev 04.07.2019 00:08

Не дублировать. Пишу на js, а не на jquery.

David Andersson 04.07.2019 00:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
211
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

У вас возникла проблема с методом JavaScript XMLHttpReqest. Он принимает как минимум два параметра: метод и URL. Полные параметры: метод, URL, асинхронный, пользователь, пароль

Измените свой код с:

 http.open("upload.php", data.action);

К:

 http.open("post", data.action );

Обновлять: Также удалить

http.setRequestHeader("content-type", "multipart/form-data")

Данные формы уже устанавливают свои заголовки для типа содержимого.

Для справки см. XMLHttpRequest.open().

showdev 04.07.2019 00:21

Я не делал этого переключения в исходном коде, но, к сожалению, все равно не влияет на результат.

David Andersson 04.07.2019 00:24

Попробуйте закомментировать setReuestHeader. Дайте мне отзыв

Edwin Dijas Chiwona 04.07.2019 00:29

Пожалуйста, отметьте ответ как правильный. Тоже обновил.

Edwin Dijas Chiwona 04.07.2019 01:20

Извините, так получилось. Я понятия не имел, что браузер сам установил заголовок типа контента в соответствующие данные формы, чтобы php мог его получить. Content-Type: multipart/form-data; border=----WebKitFormBoundaryaOHix0yHdFVLGFaG И не только: Content-Type: multipart/form-data; Спасибо!

David Andersson 04.07.2019 08:38

Вы проверили, установлено ли ограничение памяти на -1 или достаточно высокое в php. Иногда на сервере Apache или iis также существует блокировка загрузки больших файлов.

Проверено. Это небольшие файлы, и ограничение установлено на 128 МБ.

David Andersson 04.07.2019 08:18

Другие вопросы по теме