Я использую jQuery и Ajax для своих форм для отправки данных и файлов, но я не уверен, как отправить данные и файлы в одной форме?
В настоящее время я делаю почти одно и то же с обоими методами, но способ, которым данные собираются в массив, отличается, данные используют, .serialize();
но файлы используют= new FormData($(this)[0]);
Можно ли объединить оба метода, чтобы можно было загружать файлы и данные в одной форме через Ajax?
Данные jQuery, Ajax и HTML
$("form#data").submit(function(){
var formData = $(this).serialize();
$.ajax({
url: window.location.pathname,
type: 'POST',
data: formData,
async: false,
success: function (data) {
alert(data)
},
cache: false,
contentType: false,
processData: false
});
return false;
});
<form id="data" method="post">
<input type="text" name="first" value="Bob" />
<input type="text" name="middle" value="James" />
<input type="text" name="last" value="Smith" />
<button>Submit</button>
</form>
Файлы jQuery, Ajax и html
$("form#files").submit(function(){
var formData = new FormData($(this)[0]);
$.ajax({
url: window.location.pathname,
type: 'POST',
data: formData,
async: false,
success: function (data) {
alert(data)
},
cache: false,
contentType: false,
processData: false
});
return false;
});
<form id="files" method="post" enctype="multipart/form-data">
<input name="image" type="file" />
<button>Submit</button>
</form>
Как я могу объединить вышеперечисленное, чтобы я мог отправлять данные и файлы в одной форме через Ajax?
Моя цель - иметь возможность отправить всю эту форму в одном сообщении с помощью Ajax, возможно ли это?
<form id="datafiles" method="post" enctype="multipart/form-data">
<input type="text" name="first" value="Bob" />
<input type="text" name="middle" value="James" />
<input type="text" name="last" value="Smith" />
<input name="image" type="file" />
<button>Submit</button>
</form>
FormData
Подход должен работать нормально с формами , которые содержат все , что вы хотите, а не только поля закачивать файл; это не широко поддерживается, хотя.FormData
Ответы:
У меня была проблема с неправильным идентификатором jQuery.
Вы можете загружать данные и файлы с помощью одной формы, используя ajax .
PHP + HTML
JQuery + Ajax
Укороченная версия
источник
$(this)[0]
это просто псевдонимthis
, поэтомуnew FormData(this)
должно быть достаточно.async: false
Кажется, что это не требуется для работы и вызывает блокировку в мобильных (однопоточных) браузерахДругой вариант - использовать iframe и установить для него цель формы.
Вы можете попробовать это (он использует jQuery):
он хорошо работает со всеми браузерами, вам не нужно сериализовать или подготавливать данные. один недостаток в том, что вы не можете следить за прогрессом.
также, по крайней мере для chrome, запрос будет отображаться не на вкладке "xhr" инструментов разработчика, а в разделе "doc"
источник
У меня была такая же проблема в ASP.Net MVC с HttpPostedFilebase, и вместо использования формы при отправке мне нужно было нажимать кнопку, когда мне нужно было что-то делать, а затем, если все в порядке, отправить форму, вот как я ее получил
это будет правильно заполнять вашу модель MVC, пожалуйста, убедитесь, что в вашей модели свойство HttpPostedFileBase [] имеет то же имя, что и имя элемента управления вводом в html, т.е.
источник
contentType : "application/octet-stream"
Или короче:
источник
Для меня это не работает без
enctype: 'multipart/form-data'
поля в запросе Ajax. Я надеюсь, что это помогает кому-то, кто застрял в аналогичной проблеме.Хотя по какой-то причине
enctype
атрибут Ajax уже был задан в атрибуте формы , он не идентифицировал автоматическиenctype
без явного объявления (jQuery 3.3.1).Как и другие упомянутые выше, пожалуйста , также обратить особое внимание на
contentType
иprocessData
полей.источник
enctype
вообще не упоминается.enctype
поле не указано в документации по причине. Я не проверял исходный код jQuery, поэтому не могу с уверенностью сказать.enctype
поле, и оно больше не загружает файлы (возвращается ошибка типа кодировки). Я не уверен, как это работает, так как я не проверял исходный код jQuery. Я разместил этот ответ с намерением помочь другим, кто застрял в аналогичной проблеме. Я не собираюсь отдавать предпочтение здесь ... Если у вас есть дополнительные вопросы / комментарии, давайте пообщаемся, а не комментируем.Для меня следующий код работает
В вашем методе Action Post передайте параметр как HttpPostedFileBase UploadFile и убедитесь, что входные данные вашего файла совпадают с указанными в параметре метода действия. Он также должен работать с формой AJAX Begin.
Помните здесь, что ваша AJAX BEGIN Form не будет работать здесь, так как вы делаете свой почтовый вызов, определенный в коде, упомянутом выше, и вы можете ссылаться на свой метод в коде в соответствии с Требованием
Я знаю, что отвечаю поздно, но это то, что сработало для меня
источник
Простой, но более эффективный способ:
new FormData()
сам по себе как контейнер (или сумка). Вы можете поместить все attr или файл в себя. Единственное, что вам нужно добавить,attribute, file, fileName
например:и просто передать его в запросе AJAX. Например:
Вы можете добавить n файлов или данных с помощью FormData.
и если вы делаете запрос AJAX из файла Script.js в файл Route в Node.js, остерегайтесь использовать его
req.body
для доступа к данным (например, тексту)req.files
для доступа к файлу (например, к изображению, видео и т. д.)источник
В моем случае мне нужно было сделать запрос POST, в котором информация была отправлена через заголовок, а также файл, отправленный с использованием объекта FormData.
Я заставил это работать, используя комбинацию некоторых ответов здесь, так что в основном получилось, что в моем Ajax-запросе было пять строк:
Где formData была переменная, созданная следующим образом:
источник
contentType: "application/octet-stream",
Он активно вреден, и единственная причина, по которой он не вызывает проблем, заключается в том, что вы перезаписываете его двумя строками позже.enctype: 'multipart/form-data',
бессмысленно. jQuery.ajax не распознает этот параметр.///// otherpage.php
источник