У меня есть веб-приложение Java, которое включает функцию загрузки файлов. HTML-форма fileUpload.html позволяет пользователям выбирать и загружать файл на сервер. В качестве действия формы установлен сервлет ServletFileUpload.java для обработки загруженного файла.
Вот код, упомянутый выше:
<!DOCTYPE html>
<html lang = "de">
<head>
<meta charset = "UTF-8" />
<meta name = "viewport" content = "width=device-width, initial-scale=1.0" />
<title>Datei Upload</title>
</head>
<body>
<h1>Dateien hochladen</h1>
<form action = "../fileUpload" method = "POST" enctype = "multipart/form-data">
<label for = "name">Anzeigename:</label>
<input type = "text" name = "name" id = "name" required /><br />
<label for = "expirationDate">Ablaufdatum:</label>
<input
type = "date"
name = "expirationDate"
id = "expirationDate"
required
/><br />
<label for = "category">Kategorie:</label>
<select name = "category" id = "category" required>
<option value = "" disabled>Wählen Sie eine Kategorie aus</option>
<option value = "aushang1">Aushang 1</option>
<option value = "aushang2">Aushang 2</option>
<option value = "vorschriften">Sicherheitsvorschriften</option>
<option value = "notfaelle">Notfälle</option>
<option value = "organisation">Organisation</option>
<option value = "anlagenleistung">Anlagenleistung</option>
<option value = "abfuellplan">Abfüllplan</option>
<option value = "schichtplan">Schichtplan</option>
<option value = "jahresplanung">Jahresplanung</option>
</select>
<br />
<label for = "pdfFile">Wählen Sie eine PDF aus:</label>
<input type = "file" name = "pdfFile" id = "pdfFile" accept = ".pdf"required><br><br>
<input type = "submit" value = "PDF hochladen">
</form>
</body>
</html>
@WebServlet("/fileUpload")
public class ServletFileUpload extends HttpServlet {
private static final Logger logger = LogManager.getLogger(ServletFileUpload.class);
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
logger.debug("Name: {}, Expiration Date: {}, Category: {}",
request.getParameter("name"),
request.getParameter("expirationDate"),
request.getParameter("category"));
}
Проблема, с которой я столкнулся, заключается в том, что сервлет FileUpload.java, похоже, не получает никаких данных из HTML-формы. Когда я отправляю форму, вот что регистрируется:
15:38:19.860 [http-nio-8081-exec-51] ОТЛАДКА de.http.ServletFileUpload — имя: null, дата истечения срока действия: null, категория: null
При отправке формы я вижу в инструментах разработчика, что значения в форме должны быть правильными.
Я использую Tomcat 10.1, но при использовании Tomcat 9 получаю те же результаты. В catalina.log я не могу найти ничего, связанного с этой проблемой.
При изменении ссылки на действие в HTML или @WebServlet в Java я все равно сталкиваюсь с той же проблемой.
Надеюсь, у кого-нибудь есть идеи, что здесь не так.
Как уже предположил ранее комментатор: я думаю, что ваша форма отправляется как multipartform => вам нужно немного по-другому обрабатывать входящие данные. Возможно, это тоже поможет: stackoverflow.com/questions/12127531/…
Для отправки из нескольких частей вам, вероятно, потребуется использовать метод getPart HttpServletRequest, а не getParameter. Считайте строковые значения из getInputStream и используйте getContentType, чтобы определить кодировку байтов в этом InputStream.





Таким образом вы не сможете получить параметры из запроса. Тип контента multipart/form-data приводит к необходимости разбирать тело запроса по частям. То есть, если вы пытаетесь получить параметры с помощью ServletRequest.getParameter():
Возвращает значение параметра запроса как
Stringилиnull, если параметр не существует. Параметры запроса – дополнительная информация, отправлено с запросом. Для HTTP-сервлетов параметры содержатся в в строке запроса или в теле запроса, где находятся данные формы.
тогда вы получите null, потому что тело запроса имеет другой формат, и описанный выше метод работает, если тело запроса имеет формат application/x-www-form-urlencoded.
Более подробная информация о методе POST:
Метод HTTP
POSTотправляет данные на сервер. Тип тела запроса указано в заголовкеContent-Type.Разница между
PUTиPOSTв том, чтоPUTидемпотент: вызов его один или несколько раз подряд имеет тот же эффект эффект (который не является побочным эффектом), где последовательное идентичныйPOSTможет иметь дополнительные эффекты, например. передавать одни и те же данные несколько раз.Запрос
POSTобычно отправляется через HTML-форму и приводит к изменения на сервере. В этом случае тип контента выбирается размещение соответствующей строки в атрибутеenctypeэлемента<form>илиformenctypeатрибут элемента<input>или<button>:
application/x-www-form-urlencoded: ключи и значения закодированы в кортежах ключей, разделенных&, с=между ключом и значение. Небуквенно-цифровые символы как в ключах, так и в значениях. закодировано в процентах: по этой причине этот тип не подходит для использования с двоичными данными (вместо этого используйтеmultipart/form-data);multipart/form-data;text/plain.
Чтобы иметь возможность получать параметры и части файлов из запроса, вы можете использовать аннотацию @MultipartConfig:
Аннотация, которую можно разместить в классе
Servlet, с указанием что экземпляры сервлетов ожидают запросы, соответствующие типу МИМ сmultipart/form-data.Сервлеты, помеченные
MultipartConfig, могут извлекатьPartкомпоненты данногоmultipart/form-dataзапроса, звонкаgetPart()илиgetParts().
Вы также можете прочитать об аннотации @MultipartConfig в уроке .
В котором вы также можете найти пример загрузки файла с использованием этой аннотации.
Звучит как stackoverflow.com/questions/65584370/…