#java #jquery #struts2
Вопрос:
У меня есть <s:file>
тег внутри формы, который генерирует HTML <input type="file">
-код . Когда я отправляю форму с помощью отправки формы (например, кнопка отправки и т.д.), В методе действия все работает нормально. Однако, когда я изменяю свой код на:
$.ajax({
url: "actionClass!actionMethodA.action",
type: "POST",
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert('Error ' textStatus);
alert(errorThrown);
alert(XMLHttpRequest.responseText);
},
data: $(form).serialize(),
success: function(data) {
...
}
});
В бэкэнде file
поле всегда null
есть .
Поле файла определено в классе действий следующим образом (с настройщиком и получателем)::
private File impFileUrl;
Это потому, что теперь форма сериализована, так что поле файла больше не может быть правильно задано в бэкэнде?
Ответ №1:
Это происходит потому, что jQuery.serialize() сериализует только входные элементы, а не данные в них.
В строку сериализуются только «успешные элементы управления». Значение кнопки «Отправить» не сериализуется, так как форма не была отправлена с помощью кнопки. Чтобы значение элемента формы было включено в сериализованную строку, элемент должен иметь атрибут name. Значения флажков и переключателей (входы типа «радио» или «флажок») включаются только в том случае, если они установлены. Данные из элементов выбора файла не сериализуются.
Но это не значит, что вы не можете загружать файлы с помощью ajax. Для отправки FormData
объекта могут использоваться дополнительные функции или плагины.
Вы также можете использовать
FormData
с jQuery, если зададите правильные параметры:var fd = new FormData(document.querySelector("form")); fd.append("CustomField", "This is some extra data"); $.ajax({ url: "actionClass!actionMethodA.action", type: "POST", data: fd, processData: false, // tell jQuery not to process the data contentType: false // tell jQuery not to set contentType });