Я хочу загрузить изображение на сервер через ajax с помощью jQuery и FormData.
Мой код jQuery выглядит следующим образом
var formData = new FormData("form")[0]; var fileName = $("#InputLogo")[0].files[0].name; $.ajax ( { url : 'upload.php', type : 'POST', data : { "data" : formData, "fileName" : fileName }, processData : false, success : function(data) { console.log(data); alert(data); } });
Этот код вызывается, когда пользователь выбирает новый файл для загрузки.
MY server backend – это PHP, и он обрабатывает запрос следующим образом
$data = $_POST['data']; $fileName = $_POST['fileName']; $fp = fopen('/img/'.$fileName, 'w'); fwrite($fp, $data); fclose($fp); $returnData = array("data" => $data); print_r($_POST);
Запрос POST действительно имеет место, но $ _POST остается пустым.
Я попытался найти решение, но не смог найти его.
Мы ценим любые предложения.
EDIT: вот форма в HTML
<form id=card-form" method="post" action="" > <div class="form-group"> <label for="InputName">Name of the Company</label> <input type="text" class="form-control" id="InputName" placeholder="Enter a name"> </div> <div class="form-group"> <label for="InputEmail">Email</label> <input type="email" class="form-control" id="InputEmail" placeholder="Enter email"> </div> <div class="form-group"> <label for="InputLogo">Choose a company logo</label> <input type="file" id="InputLogo" accept="image/*"> <p class="help-block">For good visibility, please limit the image to 200 x 200 px</p> </div> <button type="submit" class="btn btn-default">Submit</button> </form>
Конструктор FormData()
не является механизмом выбора и не представляет собой массив, подобный массиву, поэтому var formData
, вероятно, равен undefined
.
Чтобы использовать его, вам нужно сначала найти <form>
и передать его конструктору:
var form = $('form')[0]; var formData = new FormData(form);
Если <input type="file">
находится внутри <form>
, он уже должен быть включен в formData
. Но если это не так, вы можете также .append()
:
var inputLogo = $("#InputLogo")[0]; formData.append(inputLogo.name, inputLogo.files[0]);
И, задайте formData
как отправляемые data
, сообщая jQuery, чтобы он не contentType
для него contentType
:
// ... data : formData, contentType : false, processData : false, // ...
Затем fileSize
должен быть доступен в коллекции $_FILES
PHP:
$fileName = $_FILES['inputLogo']['name'];
Я знаю, что это старый пост, но я столкнулся с этим, когда пытался решить аналогичную проблему для себя, и ни один из ответов не указал на эту проблему, поэтому я отправляю ответ, если кто-то другой найдет себя в том же ситуация.
Оказывается, что, как описано в другой статье StackOverflow:
Сохраняются ли данные формы, если входной тег не имеет имени?
если у вас нет атрибута непустого имени для элемента ввода файла, никакие данные из этого элемента не будут отправлены в запросе.
Таким образом, ваш элемент ввода:
<input type="file" id="InputLogo" accept="image/*">
Должно быть:
<input type="file" id="InputLogo" accept="image/*" name="yourfieldnamehere">
или файл не будет отправлен с данными формы.
Я тоже много пробовал со следующими способами:
var formData = new FormData("form")[0]; var formData = new FormData("form"); var formData = new FormData($('form-id')); var formData = new FormData(this);
Никто из них не работал для меня. Но, наконец, я использовал javascript способ получить elementById, и он работал отлично.
formdata = new FormData(document.getElementById('form_id'))
Обычно в заголовках запросов вы найдете зашифрованный текст, подобный приведенному ниже: multipart / form-data; граница = —- WebKitFormBoundaryUuVvGDydAdTf3Bmp
И когда вы пытаетесь оповестить данные формы, он покажет [object formdata]. Это означает, что функция formdata работает нормально.
Когда вы возвращаете значения $ _POST, $ _REQUEST или $ _FILES, а если они пусты, это означает, что formdata не может получить доступ к элементу формы. Поэтому сначала вы должны подтвердить, что formdata может получить доступ к элементу формы или нет, а затем попробовать другие возможности.
хорошо, что вам нужно учитывать при использовании formData с ajax .. и вы можете добавлять данные в FormData, используя метод append()
FormData.
попробуй это..
var formData = new FormData("form")[0]; formData.append("fileName",$("#InputLogo")[0].files[0].name); $.ajax ( { url : 'upload.php', type : 'POST', data : formData , processData : false, processData: false, // tell jQuery not to process the data contentType: false // tell jQuery not to set contentType success : function(data) { console.log(data); alert(data); } });
Справка
Одна из проблем заключается в том, что файловые загрузки через Ajax не работают, если вы не используете некоторые преимущества HTML5.
Вот сообщение о том, как это описать: как я могу загружать файлы асинхронно?
Здравствуйте @panx извините за поздний ответ. У меня была такая же проблема, но без использования JQuery я решил ее удалить все заголовки из моего запроса ajax. Поэтому удалите любые RequestHeaders, прокомментировав их и повторите попытку, если у вас все еще есть эта проблема.