Передать на сервер файл java

Обновлено: 07.07.2024

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

Случай использования

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

Давайте рассмотрим все компоненты нашего веб-приложения и разберемся с реализацией.

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

Мы можем загрузить файл на сервер, отправив запрос на отправку сервлету и отправив форму. Мы не можем использовать метод GET для загрузки файла. Еще один момент, на который следует обратить внимание, это то, что тип формы должен быть multipart / form-data . Чтобы выбрать файл из файловой системы пользователя, нам нужно использовать элемент ввода с типом как файл . Таким образом, у нас может быть простая HTML-страница для загрузки файла:

index.html

< form action = "UploadDownloadFileServlet" method = "post" enctype = "multipart/form-data" > Select File to Upload:< input type = "file" name = "fileName" >

Расположение файла сервера

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

Наш файл web.xml будет выглядеть следующим образом:

web.xml

< web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns = "http://java.sun.com/xml/ns/javaee" xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version = "3.0" > < display-name >ServletFileUploadDownloadExample</ display-name >

Реализация ServletContextListener

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

Наш код реализации ServletContextListener подобен ниже.

public class FileLocationContextListener implements ServletContextListener < public void contextInitialized(ServletContextEvent servletContextEvent) < ServletContext ctx = servletContextEvent.getServletContext(); String relativePath = ctx.getInitParameter( "tempfile.dir" ); File file = new File(rootPath + File.separator + relativePath); System.out.println( "File Directory created to be used for storing files" ); ctx.setAttribute( "FILES_DIR" , rootPath + File.separator + relativePath); public void contextDestroyed(ServletContextEvent servletContextEvent) <

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

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

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

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

Как только мы закончим с настройкой конфигурации ответа, мы можем прочитать содержимое файла из InputStream и записать его в ServletOutputStream и очистить вывод для клиента.

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

В спецификацию Java EE 6 включены Servlet 3.0, интерфейс «Part» и аннотация @MultiPartConfig, обеспечивающие простой способ загрузки файлов FileUpload на сервер без каких либо сторонних библиотек. Поэтому любая реализация сервлета 3.0 на серверах типа Tomcat 7.х, JBoss 6.х, GlassFish 3.х дают выгоду при загрузке файла.

С выходом очередной версии JSF 2.2 у разработчиков, использующих данный фреймворк, также появилась возможность легкой загрузки файлов на сервер. В данной статье будет рассмотрен пример FileUpload использования компонента h:inputFile для реализации этой возможности.

Структура примера FileUpload

Структура примера включает компонент DemoBean.java, файлы дескриптора web.xml и конфигурации faces-config.xml, страницы выбора файлов index.xhtml и результатов загрузки success.xhtml. В директории lib размещается библиотечный файл фреймворка JSF 2.2. Файлы загружаются в поддиректорию upload проекта. Структура проекта Eclipse представлена на следующем скриншоте.


Листинг компонента DemoBean.java

В компоненте DemoBean.java определены поля файлов (file1, file2) типа Part с методами get/set и метод upload(), который возвращает наименование страницы success без расширения (т.е. без «.xhtml») согласно упрощенной навигации фреймворка JSF. Для «полного» перехода на страницу success.xhtml используется параметр «?faces-redirect=true».

Вспомогательный метод setDirUpload() позволяет определить путь к директории upload приложения через класс ServletContext. Следует обратить внимание, что при работе приложения под управлением IDE (Eclipse) будет определена несколько иная директория, поскольку среда разработки формирует свою рабочую директорию в workspace проектов. Если расскоментировать строку вывода в консоль полного пути директории DIR, то можно будет увидеть что-то подобное
D:\projects\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\UploadFile\

Листинг конфигурации приложения faces-config.xml

Файл конфигурации faces-config.xml примера FileUpload не используется, поскольку последние версии допускают облегченную навигацию. В этой связи метод upload() компонента DemoBean возвращает адрес страницы success без расширения.

Листинг дескриптора приложения web.xml

В дескрипторе приложения определяются стандартные параметры - уровень контекста Development, сервлет FacesServlet, timeout 30 и открываемая страница по умолчанию faces/index.xhtml.

Листинг страницы index.xhtml

На странице загрузки файлов на сервер необходимо выбрать файлы и нажать кнопку «Загрузить». Компонент фреймворка JSF h:inputFile работает с файловой системой на компьютера пользователя и позволяет не напрягаясь с помощью мышки выбрать необходимый файл. В атрибуте value необходимо указать соответствующие «объекты» типа Part компонента JavaBean.

Загрузка файла сервлета и загрузка файла-обычная задача в веб-приложении 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-адресам.

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

Java

Клиент-серверная архитектура — наиболее распространенная структура приложений в Интернете. В этой архитектуре клиенты (т.е. персональные компьютеры, устройства Интернета вещей и т. д.) сначала запрашивают ресурсы с сервера. Затем сервер отправляет обратно соответствующие ответы на запросы клиентов. Чтобы это произошло, должен быть какой-то механизм, реализованный как на стороне клиента, так и на стороне сервера, который поддерживает эту сетевую транзакцию. Этот механизм называется коммуникацией посредством сокетов.

Почти каждое приложение, которое полагается на сетевые операции, такие как извлечение данных с удаленных серверов и загрузка файлов на сервер, широко использует сокеты “под капотом”. Несколько примеров таких приложений — браузеры, чат-приложения и одноранговые сетевые приложения.

В этой статье мы более подробно рассмотрим сокеты и простую клиент-серверную реализацию с использованием сокетов в Java.

Примечание: существует два типа сокетов: TCP и UDP. Поскольку большинство сетевых приложений используют TCP, здесь я буду говорить только о TCP-сокетах и их реализации.

Что такое сокет?

Сокет — это программная (логическая) конечная точка, устанавливающая двунаправленную коммуникацию между сервером и одной или несколькими клиентскими программами. Сокет — это нечто “программное”. Другими словами, сокет не существует на физическом уровне. Прикладное программное обеспечение определяет сокет так, чтобы он использовал порты на основном компьютере для его реализации. Это позволяет программистам комфортно работать с низкоуровневыми деталями сетевых коммуникаций, такими как порты, маршрутизация и т. д., внутри прикладного кода.

Как работают сокеты?

TCP-сокет устанавливает связь между клиентом и сервером в несколько этапов.


Блок-схема коммуникации TCP-сокета
  • Socket() — на сервере создается конечная точка для коммуникации.
  • Bind() — сокету присваивается уникальный номер и для него резервируется уникальная комбинации IP-адреса и порта.
  • Listen() — после создания сокета сервер ожидает подключения клиента.
  • Accept() — сервер получает запрос на подключение от клиентского сокета.
  • Connect() — клиент и сервер соединены друг с другом.
  • Send()/Recieve() — обмен данными между клиентом и сервером.
  • Close() — после обмена данными сервер и клиент разрывают соединение.

К настоящему времени мы уже достаточно знаем о TCP-сокетах. Давайте теперь посмотрим на них в действии.

Реализация коммуникации посредством TCP-сокетов в Java

Давайте посмотрим, как мы можем реализовать коммуникацию сокетов в Java. Мы сейчас напишем две Java-программы. Одной будет программа, запущенная на сервере, а другой — клиентская программа, которая будет взаимодействовать с сервером.

Реализация серверного сокета

В приведенной выше программе сервер открывает сокет с порта 50001 на серверной машине и ожидает клиента на server.accept() . После подключения клиента создается экземпляр выходного потока. Это может быть использовано для отправки данных с сервера на подключенный клиент. Именно это и делает serverOutput.writeBytes() . После отправки данных соединение с клиентом завершается.

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

Реализация клиентского сокета

Запуск программ

Сначала запустите серверную Java-программу, а затем клиентскую Java-программу (потому что сервер уже должен работать для подключения клиента). Вы увидите Received data: Java Revisited в терминале, где работает клиентская программа. Вот что здесь произошло: серверная программа отправила данные клиенту по запросу, а клиентская программа вывела их на терминал.

В этой статье мы обсудили, что такое сокеты и Java-реализация связи TCP-сокетов.

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