Как загрузить файл на сервер servlet

Обновлено: 05.07.2024

Как я могу загрузить файлы на сервер, используя JSP/Servlet? Я попробовал это:

Однако я получаю только имя файла, а не содержимое файла. Когда я добавляю enctype="multipart/form-data" к <form> , тогда request.getParameter() возвращает null .

Во время исследования я наткнулся на Apache Common FileUpload . Я попробовал это:

Вступление

Для просмотра и выбора файла для загрузки вам нужно поле HTML <input type="file"> в форме. Как указано в спецификация HTML , вы должны использовать метод POST , а атрибут enctype формы должен быть установлен в "multipart/form-data" .

После отправки такой формы двоичные данные многочастной формы доступны в теле запроса в другой формат , чем, если enctype не установлено.

До Servlet 3.0 Servlet API изначально не поддерживал multipart/form-data . Он поддерживает только тип формы по умолчанию application/x-www-form-urlencoded . Все функции request.getParameter() и consorts будут возвращать null при использовании данных многочастной формы. Это где хорошо известный Apache Commons FileUpload вошел в картину.

Не разбирайте его вручную!

Если вы уже используете Servlet 3.0 или новее, используйте собственный API

Сначала аннотируйте свой сервлет с помощью @MultipartConfig , чтобы он мог распознавать и поддерживать запросы multipart/form-data и, таким образом, заставить getPart() работать:

Затем реализуйте его doPost() следующим образом:

Если у вас есть <input type="file" name="file" multiple="true" /> для многофайловой загрузки, соберите их, как показано ниже (к сожалению, нет такого метода, как request.getParts("file") ):

Если вы еще не используете Servlet 3.1, вручную введите имя файла

Обратите внимание на исправление MSIE относительно получения имени файла. Этот браузер неправильно отправляет полный путь к файлу вдоль имени, а не только имя файла.

Если вы еще не используете Servlet 3.0, используйте Apache Commons FileUpload

Если вы еще не используете Servlet 3.0 (не пора ли обновиться?), Обычной практикой является использование Apache Commons FileUpload для анализа запросов данных из нескольких частей. У него есть отличные Руководство пользователя и FAQ (внимательно просмотрите оба). Также есть O'Reilly (" cos ") MultipartRequest , но он имеет некоторые (незначительные) ошибки и больше не поддерживается в течение многих лет. Я не рекомендовал бы использовать это. Apache Commons FileUpload все еще активно поддерживается и в настоящее время очень зрелый.

Чтобы использовать Apache Commons FileUpload, вы должны иметь как минимум следующие файлы в /WEB-INF/lib вашего веб-приложения:

Ваша первоначальная попытка, скорее всего, не удалась, потому что вы забыли общий ввод-вывод.

Вот начальный пример того, как doPost() вашего UploadServlet может выглядеть при использовании Apache Commons FileUpload:

В качестве альтернативы вы можете также обернуть все это в Filter , который автоматически анализирует все это и поместить его обратно в таблицу параметров запроса, чтобы вы могли продолжить использование request.getParameter() обычным способом и получить загруженный файл с помощью request.getAttribute() . Вы можете найти пример в этой статье блога .

Обходной путь для ошибки GlassFish3 getParameter() , все еще возвращающей null

Обратите внимание, что версии Glassfish старше 3.1.2 имели ошибка , где getParameter() по-прежнему возвращает null . Если вы нацеливаетесь на такой контейнер и не можете обновить его, вам нужно извлечь значение из getPart() с помощью этого служебного метода:

Сохранение загруженного файла (не используйте ни getRealPath() , ни part.write() !)

Перейдите к следующим ответам для получения подробной информации о правильном сохранении полученного InputStream (переменная fileContent , как показано в приведенных выше фрагментах кода) на диск или в базу данных:

Обслуживание загруженного файла

Обратитесь к следующим ответам для получения подробной информации о правильной доставке сохраненного файла с диска или базы данных обратно клиенту:

Аяксификация формы

Перейдите к следующим ответам, как загрузить с помощью Ajax (и jQuery). Обратите внимание, что код сервлета для сбора данных формы не нужно менять для этого! Может быть изменено только то, как вы отвечаете, но это довольно тривиально (то есть вместо пересылки в JSP просто напечатайте некоторый JSON или XML или даже простой текст в зависимости от того, что ожидает скрипт, ответственный за вызов Ajax).

В данной статье мы рассмотрим загрузку файлов (uploading) при работе с сервлетами.

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

Для понимания того, как это работает на практике, рассмотрим простой пример.

В качестве основы возьмём приложение из данной статьи.

После этого необходимо в консоли выполнить команду:

И перейти по ссылке:

В результате мы получим следующие страницы:

servletsTutorialUploadFileDemo1

После нажатия кнопки Browse

servletsTutorialFileUploadDemo2

После выбора файла temp1.txt

servletsTutorialFileUploadDemo3.jpg

После нажатия кнопки Upload File:

servletsTutorialFileUploadDemo4

В результате в указанной нами директории появится выбранный файл:

servletsTutorialFileUploadDemo5

На этом мы заканчиваем изучение загрузки файлов при работе с сервлетами.

В следующей статье мы рассмотрим один из способов отправки email с помощью сервлетов.

Загрузка файла сервлета и загрузка файла-обычная задача в веб-приложении java . Поскольку в последнее время я много писал о сервлете java, я подумал привести пример загрузки файла сервлета на сервер, а затем загрузки с сервера на клиент.

Файл Загрузки Сервлета

Наш вариант использования-предоставить простую HTML-страницу, на которой клиент может выбрать локальный файл для загрузки на сервер. При отправке запроса на загрузку файла наша программа-сервлет загрузит файл в каталог на сервере, а затем предоставит URL-адрес, по которому пользователь может загрузить файл. По соображениям безопасности пользователю не будет предоставлен прямой URL-адрес для загрузки файла, скорее ему будет предоставлена ссылка для загрузки файла, и наш сервлет обработает запрос и отправит файл пользователю.

Мы создадим динамический веб-проект в Eclipse, и структура проекта будет выглядеть так, как показано на рисунке ниже.

HTML-страница для загрузки файла Java на сервер

Мы можем загрузить файл на сервер, отправив запрос post на сервлет и отправив форму. Мы не можем использовать метод GET для загрузки файла.

Еще один момент, который следует отметить, заключается в том, что тип формы должен быть составным/данные формы .

Чтобы выбрать файл из пользовательской файловой системы, нам нужно использовать ввод элемент с типом как файл .

Таким образом, у нас может быть простая HTML-страница index.html для загрузки файла в виде:

Расположение файла на сервере для загрузки файла

Нам нужно сохранить файл в некотором каталоге на сервере, мы можем жестко закодировать этот каталог в программе, но для большей гибкости мы будем настраивать его в параметрах контекста дескриптора развертывания. Также мы добавим нашу html-страницу загружаемого файла в список файлов приветствия.

Ваш web.xml файл будет выглядеть так, как показано ниже:

ServletContextListener для расположения загрузки файлов

Поскольку нам нужно прочитать параметр контекста для расположения файла и создать из него объект файла, мы можем написать ServletContextListener, чтобы сделать это при инициализации контекста. Мы можем установить абсолютное местоположение каталога и объект файла в качестве атрибута контекста, который будет использоваться другими сервлетами.

Наш код реализации ServletContextListener выглядит следующим образом.

Загрузка файла Сервлет Загрузки

Обновление : Спецификации сервлета 3 добавлена поддержка загрузки файлов на сервер в API, поэтому нам не нужно будет использовать какой-либо сторонний API. Пожалуйста, проверьте Файл загрузки сервлета 3 .

Для загрузки файлов мы будем использовать утилиту Apache Commons FileUpload , для вашего проекта мы используем версию 1.3, Загрузка файлов зависит от Apache Commons IO jar, поэтому нам нужно поместить оба файла в каталог lib проекта, как вы можете видеть на рисунке выше для структуры проекта.

Поскольку вся цель сервлета заключается в загрузке файла, мы переопределим метод init() для инициализации экземпляра объекта DiskFileItemFactory сервлета. Мы будем использовать этот объект в реализации метода doPost() для загрузки файла в каталог сервера.

Как только файл будет успешно загружен, мы отправим клиенту ответ с URL-адресом для загрузки файла, поскольку ссылки HTML используют метод GET,мы добавим параметр для имени файла в URL-адрес и сможем использовать тот же метод servlet doGet() для реализации процесса загрузки файла.

Для реализации сервлета загрузки файла сначала мы откроем входной поток для файла и используем ServletContext.getMimeType() метод, чтобы получить тип MIME файла и установить его в качестве типа содержимого ответа.

Наша окончательная реализация сервлета UploadDownloadFileServlet выглядит следующим образом.

Пример выполнения проекта показан на изображениях ниже.

Вы можете скачать Apache Commons IO jar и Apache Commons FileUpload jar по указанным ниже URL-адресам.

Ознакомьтесь со следующей статьей из серии об Обработке исключений сервлетов .

Введение в сервлеты

Сервлеты-введение

Жизненный цикл

Весь жизненный цикл сервлета управляется контейнером сервлета, который использует интерфейс javax.servlet.Servlet для понимания объекта сервлета и управления им.

Жизненный цикл сервлета проходит в основном четыре этапа:

Жизненный цикл сервлета

Загрузка

Когда сервер запускается, контейнер сервлета развертывается и загружает все сервлеты.

Инициализация

Затем сервлет инициализируется путем вызова метода init(). Метод Servlet.init() вызывается контейнером Servlet для уведомления о том, что этот экземпляр Servlet успешно создан и готов к запуску.

Обработка запросов

Затем сервлет вызывает метод service() для обработки запроса клиента и вызывается для информирования сервлета о клиентских запросах.

Уничтожение

Наконец, сервлет завершается вызовом destroy(). Метод запускается только один раз за время существования сервлета и сообщает об окончании экземпляра сервлета.

Шаги по созданию

Чтобы создать сервлет, нам нужно выполнить несколько шагов по порядку. Они заключаются в следующем:

  1. Создать структуру каталогов.
  2. Создать сервлет.
  3. Скомпилировать сервлет.
  4. Добавить сопоставления в файл web.xml.
  5. Запустить сервер и развернуть проект.
  6. Доступ к сервлету.

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

Теперь давайте рассмотрим пример, в котором будем создавать простой сервлет входа в систему и отображать вывод в браузере.

Сначала создадим файл index.html.

Далее закодируем файл класса Java.

Файл web.xml будет присутствовать в папке WEB-INF вашего веб-контента. Если его нет, вы можете щелкнуть по дескриптору развертывания и нажать «Создать заглушку дескриптора развертывания». Как только вы подготовите файл web.xml, нужно добавить в него сопоставления. Давайте посмотрим, как выполняется сопоставление на следующем примере:

Универсальные

Теперь давайте посмотрим, как создать и вызвать универсальный сервлет. Будем кодировать 3 файла, как показано ниже:

HTML-файл

Мы создаем файл HTML, который будет вызывать сервлет, как только нажмем на ссылку на веб-странице. Создайте этот файл в папке WebContent. Путь к этому файлу должен выглядеть следующим образом: WebContent / index.html

Файл класса Java

Здесь мы будем создавать универсальный сервлет, расширяя класс GenericServlet. При создании GenericServlet необходимо переопределить метод service(). Щелкните правой кнопкой мыши на папке src и создайте новый файл класса и назовите файл как общий. Путь к файлу должен выглядеть следующим образом: Java Resouces / src / default package / generic.java

web.xml

Этот файл можно найти по этому пути. WebContent / WEB-INF / web.xml. В этом файле мы сопоставим сервлет с конкретным URL. Поскольку вызываем страницу приветствия после нажатия на ссылку в index.html, она отобразит страницу приветствия в класс Servlet, который уже создали выше.

После этого запустите сервер Tomcat и запустите сервлет. Вы получите желаемый результат. Так что это все о универсальных сервлетов. Теперь давайте двигаться дальше и понять концепцию отслеживания сеансов.

Отслеживание сеансов

сервер обрабатывает запрос

Чтобы распознать конкретного пользователя, нам нужно отслеживать сеанс.

Файлы cookie

Как работает Cookie?

Поскольку это метод отслеживания сеансов, по умолчанию каждый запрос рассматривается как новый запрос.

Как работает Cookie

Теперь, когда вы поняли, как работают файлы cookie, давайте рассмотрим небольшой пример, иллюстрирующий использование файлов cookie.

Давайте посмотрим пример создания файла cookie, добавления ответа и получения результатов.

Пример

Теперь давайте создадим простую HTML-форму для файлов cookie.

Теперь вы готовы к казни. Вы можете запустить код и получить желаемый результат. Вот как работает cookie.

Элементы сценариев

Элементы сценариев предоставляют возможность вставлять Java-код в JSP. Существует три типа элементов сценариев:

Тег скриптлета

Используется для выполнения исходного кода Java в JSP.

Тег выражения

Код, помещенный в тег выражения JSP, записывается в выходной поток ответа. Поэтому вам не нужно записывать out.print() для записи данных. Он в основном используется для печати значений переменной или метода.

Теперь давайте возьмем небольшой пример отображения текущего времени. Чтобы отобразить текущее время, мы использовали метод getTime() класса Calendar. GetTime() является методом экземпляра класса Calendar, поэтому мы вызвали его после получения экземпляра класса Calendar методом getInstance().

Тег объявления

Используется для объявления полей и методов. Код, написанный внутри тега объявления JSP, размещается вне метода service() автоматически сгенерированного сервлета. Так что он не получает память при каждом запросе.

В приведенном ниже примере тега объявления JSP мы определяем метод, который возвращает куб с заданным числом, и вызываем этот метод из тега выражения JSP. Но мы также можем использовать тег скриптлета JSP для вызова объявленного метода. Посмотрим как. Файл: index.jsp

Пример неявного объекта запроса JSP

Неявный объект ответа JSP

Читайте также: