JavaScript для PHP через AJAX - PHP получает пустой массив

Я пытаюсь отправить файл на PHP из JavaScript через AJAX, но PHP получает пустой массив.

В настоящее время я пытаюсь создать веб-страницу, через которую я могу передать файл в PHP, чтобы он мог получать доступ и сохранять информацию изнутри в БД. Несмотря на то, что у JavaScript есть файл, и с помощью инструментов проверки я подтвердил, что файл на самом деле отправлен, массив, который получает PHP, пуст.

Файл попадает в JavaScript из HTML через файл входного типа. Благодаря тестированию я уверен, что эта часть работает хорошо.

function post($event)
    {
      var script = document.createElement('script');
      script.scr = '//code.jquery.com/jquery-1.12.0.min.js';
      document.getElementsByTagName('head')[0].appendChild(script);




      try
      {
        var fileSTA = $event[0];

         var formData = new FormData();
         formData.append('file', fileSTA);

         $.ajax({
                type: 'POST',
                processData: false, // required
                contentType: false, // required
                url: 'saveSTAtoDatabase.php',// do roota wrzucic pliki
                data: formData,
               //  data: {'file': formData},    //formData vs fileSTA  // just checking

                success: function(data)
                          { 
                              alert(data);
                          },
                error: function (xhr, ajaxOptions, thrownError) 
                {
                 alert("Ajax error: " + xhr.status + " (" + thrownError + ")");
                }
                });
        }
        catch(err)
        {
          alert("JavaScript error: " + err);
        }
    }

Я включу php, чтобы дать представление о том, как я пытаюсь получить доступ к отправке данных. Обновлено: я думаю, что создал некоторую путаницу со строкой выше, моя конечная цель - получить доступ к данным внутри файла. Ниже код показывает, какие возвращаемые сообщения я получаю.

<?php
    $file = $_POST;
    var_dump($file); //returns: array(0) {}
    var_dump($_POST); //returns: array(0) {}
    echo $_GET['file']; //returns: Undefined index: file
    echo $_POST['file'];  //returns: Undefined index: file

?>

Я ожидаю, что файл будет передан PHP, чтобы он мог получить доступ к данным внутри файла и обработать их дальше.

Извините, если этот вопрос уже задавался ранее, но все темы, которые я нашел, были неприменимы ко мне. Я новый разработчик, пожалуйста, не ненавидьте меня слишком сильно.

    <script src = "//code.jquery.com/jquery-1.12.0.min.js"></script>
    <input id = "hejka" type = "file" onchange = "post(this.files)"/>
    <script type = "text/javascript" src = "{sugar_getjspath file='include/javascript/popup_parent_helper.js'}"></script>

Ты проходишь filee, но ищешь file... formData.append('filee', fileSTA);

BenM 16.07.2019 10:14

Моя ошибка, это остатки некоторых тестов, которые я провел, чтобы выяснить проблему.

Krzysztof Kaliszuk 16.07.2019 10:14

попробуйте проверить $_FILES вместо $_POST и установите для contentType значение false в вашем запросе

Mohammed El Banyaoui 16.07.2019 10:28

Как выглядит ваш HTML? Вы добавили enctype = "multipart/form-data" в форму?

Refilon 16.07.2019 10:38

Каково содержание $event[0]? Кроме того, я думаю, что поле data должно быть уже сериализованным FormData, а не объектом.

solarc 16.07.2019 10:43

@Refilon добавил часть html для уточнения

Krzysztof Kaliszuk 16.07.2019 10:43

@solarc $event[0] — это файл, HTML отправляет массив с одним элементом. Я где-то читал, что пост должен заботиться о сериализации. Я пробовал так: $(fileSTA).serialize(); и он вернул пустой массив.

Krzysztof Kaliszuk 16.07.2019 11:09

@MohammedElBanyaoui Я сделал то, что вы предложили, и взамен получил массив с именем файла, типом, tmp_name, ошибкой и размером. У всех были данные, кроме ошибки, которая была пустой.

Krzysztof Kaliszuk 16.07.2019 11:14

@solarc — передача объекта FormData в порядке.

Quentin 16.07.2019 11:28
Опасность — jquery-1.12.0 — jQuery 1.x не поддерживается и не получает обновлений безопасности. Используйте поддерживаемую версию jQuery.
Quentin 16.07.2019 11:28

это все, что вам нужно, используйте move_uploaded_file() -to Перемещает загруженный файл в новое место

Mohammed El Banyaoui 16.07.2019 11:30

@MohammedElBanyaoui — они не могут переместить файл, пока не прочитают его временный путь.

Quentin 16.07.2019 11:34
Поведение ключевого слова "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
12
84
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

ваш код должен быть таким, пожалуйста, ваша проблема решит этот код

print_r($_FILES)// return file array

print_r($_FILES['file']); // return an array named file

echo $_FILES['file']['name']; // returns filename
Ответ принят как подходящий

У вас две проблемы:


Сломанный тип контента

(NB: после написания этого ответа вопрос был отредактирован, чтобы устранить эту проблему)

contentType: '', // required

Это устанавливает тип содержимого в пустую строку. PHP не может разобрать тело POST, не зная, что такое тип содержимого.

Измените его на:

contentType: false,

Это говорит jQuery не устанавливать Content-Type вообще, что позволяет базовому объекту XMLHttpRequest вывести его из объекта FormData.


Глядя не в те места

Отправленные файлы не отображаются в $_POST или $_GET. Они появляются в $_FILES.

Измените PHP:

var_dump($_FILES);

После внесения этих изменений код работал, когда я тестировал его локально.

Хорошо, я сделал это и получил информацию о файле: имя, тип, tmp_name, ошибку и размер. С ошибкой, являющейся единственной пустой. Но как мне теперь получить доступ к данным внутри файла. Я думал, что $_FILES дает только основную информацию об отправленных файлах. Я понимаю, что моя конечная цель, возможно, не была указана в вопросе.

Krzysztof Kaliszuk 16.07.2019 11:38

У вас есть tmp_name, поэтому используйте его, чтобы открыть файл. например с php.net/manual/en/function.file-get-contents.php

Quentin 16.07.2019 11:42

Вот и все! Большое спасибо!

Krzysztof Kaliszuk 16.07.2019 11:48

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