File Upload

Пример загрузки файла сервлетом и файла загрузки

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

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

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

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

Servlet-File-Upload-Скачать

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

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

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

Читайте также:  Php echo post permalink

index.html

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

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

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

web.xml

Реализация ServletContextListener

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

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

FileLocationContextListener.java

Загрузка файла Скачать Внедрение сервлета

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

Мы будем использовать фабрику DiskFileItemFactory, которая предоставляет метод для анализа объекта HttpServletRequest и возврата списка FileItem . FileItem предоставляет полезный метод для получения имени файла, имени поля в форме, размера и типа содержимого, подробностей файла, который должен быть загружен. Чтобы записать файл в каталог, нам нужно только создать объект File и передать его в качестве аргумента методу FileItem write () .

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

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

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

Нам также нужно будет указать длину содержимого ответа как длину файла. Чтобы клиент понял, что мы отправляем файл в ответ, нам нужно установить заголовок « Content-Disposition » со значением « attachment»; имя файла = “имя файла” .

Как только мы закончим с настройкой конфигурации ответа, мы можем прочитать содержимое файла из 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

import java.io.File; import java.io.IOException; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import javax.faces.context.FacesContext; import javax.servlet.ServletContext; import javax.servlet.http.Part; @ManagedBean @SessionScoped public class DemoBean < private Part file1; private Part file2; private static String DIR = null; public Part getFile1() < return file1; >public void setFile1(Part file1) < this.file1 = file1; >public Part getFile2() < return file2; >public void setFile2(Part file2) < this.file2 = file2; >private static void setDirUpload() < ServletContext servletContext = (ServletContext)FacesContext .getCurrentInstance() .getExternalContext() .getContext(); String path = servletContext.getRealPath("/"); File fl = new File(path + "/upload"); DIR = fl.getPath() + File.separator; // System.out.println (DIR); >public String upload() throws IOException < if (DIR == null) setDirUpload(); file1.write(DIR + getFilename(file1)); file2.write(DIR + getFilename(file2)); return "success?faces-redirect=true"; >private static String getFilename(Part part) < for (String file : part.getHeader("content-disposition") .split(";")) < if (file.trim().startsWith("filename")) < String filename = file.substring(file.indexOf('=') + 1) .trim().replace("\"", ""); return filename.substring(filename.lastIndexOf('/') + 1) .substring(filename .lastIndexOf('\\') + 1); >> return null; > >

В компоненте 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

   javax.faces.PROJECT_STAGE Development  Faces Servlet javax.faces.webapp.FacesServlet 1  Faces Servlet /faces/*  30  faces/index.xhtml   

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

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

      

Загрузка файлов на сервер

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

Интерфейс страницы index.xhtml представлен на следующем скриншоте.

При нажатии на кнопку «Загрузить» будет вызван метод upload() компонента DemoBean и сервер откроет страницу success.xhtml.

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

      

Загрузка файлов

Файлы загружены на сервер!

На странице успешной загрузки файлов приводится соответствующее сообщение. Интерфейс страницы success.xhtml представлен на следующем скриншоте.

Обратите внимание на адрес страницы (URL) — «success.xhtml». Если бы метод upload() класса DemoBean.java вернул только «success», а не «success?faces-redirect=true», то в адресе строки осталась бы страница index.xhtml.

Скачать пример FileUpload

Исходный код рассмотренного примера FileUpload в виде проекта Eclipse можно скачать здесь (2.71 Мб). Проект включает javax.faces-2.2.0.jar.

Источник

Оцените статью