Я пытаюсь отправить файл на 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>
Моя ошибка, это остатки некоторых тестов, которые я провел, чтобы выяснить проблему.
попробуйте проверить $_FILES вместо $_POST и установите для contentType значение false в вашем запросе
Как выглядит ваш HTML? Вы добавили enctype = "multipart/form-data" в форму?
Каково содержание $event[0]? Кроме того, я думаю, что поле data должно быть уже сериализованным FormData, а не объектом.
@Refilon добавил часть html для уточнения
@solarc $event[0] — это файл, HTML отправляет массив с одним элементом. Я где-то читал, что пост должен заботиться о сериализации. Я пробовал так: $(fileSTA).serialize(); и он вернул пустой массив.
@MohammedElBanyaoui Я сделал то, что вы предложили, и взамен получил массив с именем файла, типом, tmp_name, ошибкой и размером. У всех были данные, кроме ошибки, которая была пустой.
@solarc — передача объекта FormData в порядке.
это все, что вам нужно, используйте move_uploaded_file() -to Перемещает загруженный файл в новое место
@MohammedElBanyaoui — они не могут переместить файл, пока не прочитают его временный путь.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


ваш код должен быть таким, пожалуйста, ваша проблема решит этот код
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 дает только основную информацию об отправленных файлах. Я понимаю, что моя конечная цель, возможно, не была указана в вопросе.
У вас есть tmp_name, поэтому используйте его, чтобы открыть файл. например с php.net/manual/en/function.file-get-contents.php
Вот и все! Большое спасибо!
Ты проходишь
filee, но ищешьfile...formData.append('filee', fileSTA);