Сервлет получает нулевые значения после загрузки файла

У меня есть веб-приложение 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 я все равно сталкиваюсь с той же проблемой.

Надеюсь, у кого-нибудь есть идеи, что здесь не так.

Звучит как stackoverflow.com/questions/65584370/…

nitind 05.10.2023 16:25

Как уже предположил ранее комментатор: я думаю, что ваша форма отправляется как multipartform => вам нужно немного по-другому обрабатывать входящие данные. Возможно, это тоже поможет: stackoverflow.com/questions/12127531/…

roediGERhard 05.10.2023 16:55

Для отправки из нескольких частей вам, вероятно, потребуется использовать метод getPart HttpServletRequest, а не getParameter. Считайте строковые значения из getInputStream и используйте getContentType, чтобы определить кодировку байтов в этом InputStream.

VGR 05.10.2023 18:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Таким образом вы не сможете получить параметры из запроса. Тип контента 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 в уроке .

В котором вы также можете найти пример загрузки файла с использованием этой аннотации.

Другие вопросы по теме