Как передать дополнительную информацию с помощью <input type = "file">?

Мне нужно загрузить файлы в сервлет, работающий на tomcat. В дополнение к файлу я хочу разрешить пользователю добавлять комментарий, связанный с загруженным файлом. Я попробовал следующее, но это не сработало:

<form action='MyUploadServlet' enctype='multipart/form-data' method='POST'>
    <input type='file' name='filechooser'><br />
    <textarea name='comment' cols='15' rows='5'></textarea>
    <input type='Submit' value='Upload'><br />
</form>

Вот фрагмент кода сервера:

@WebServlet("/MyUploadServlet") 
public class MyUploadServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
        {
            ServletContext sc = request.getServletContext();
            String comment = (String)request.getParameter("comment");
            ....etc}

Пропущенная часть кода сервера имеет дело с получением содержимого загруженного файла.

Строка выше request.getParameter("comment") возвращает ноль. Я использую несколько сервлетов и несколько форм в моем приложении. Во всех других местах, если я использую request.getParameter("form-input-name"), я всегда получаю значение соответствующего поля ввода. Это единственное исключение, а именно, когда форма имеет поле ввода типа "файл".

Как передать комментарий вместе с отправкой файла?

1 ответ

Решение

Вам необходимо получить значение текстового поля тем же API, который вы использовали для получения содержимого загруженного файла.

Вы указали форму HTML для отправки данных в multipart/form-data кодировка вместо стандартной application/x-www-form-urlencoded кодирование. multipart/form-data кодирование является обязательным для отправки содержимого файла вместе с отправкой формы. Тем не менее getParameter() метод работает в сочетании с application/x-www-form-urlencoded только.

multipart/form-data запрос обычно разбирается с multipart/form-data синтаксический анализатор, такой как хорошо известный Apache Commons FileUpload, который является стандартом де-факто в этой области. Тем не менее, начиная с Servlet 3.0 (который вы, кажется, на самом деле используете, учитывая наличие также в Servlet 3.0 введен @WebServlet аннотации), есть новый getParts() метод, который позволяет извлекать необходимые отправленные данные, используя стандартные методы, без использования Apache Commons FileUpload. Тем не менее, он все еще немного более подробный, чем с Apache Commons FileUpload. Вы можете найти конкретный пример обоих подходов в этом ответе: Как загрузить файлы на сервер, используя JSP/Servlet?

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