Как передать дополнительную информацию с помощью <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?