Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Загрузка файлов с помощью сервлетов Java

Поддержка загрузки файлов является весьма распространённым требованием для многих веб-приложений. В предыдущих версиях спецификации сервлета для загрузки файлов требовалось использование внешних библиотек или сложной обработки ввода. Спецификация сервлета Java теперь обеспечивает жизнеспособное решение проблемы в общем и переносимом виде. Технология Java Servlet теперь поддерживает загрузку файлов "из коробки", поэтому любой веб-контейнер, реализующий спецификацию, может анализировать многочастные (multipart) запросы и делать вложения mime доступными через объект HttpServletRequest.

Новая аннотация javax.servlet.annotation.MultipartConfig указывает, что сервлет, аннотированный ею, ожидает выполнения запросов с использованием типа MIME multipart/form-data. Сервлеты, аннотированные @MultipartConfig, могут извлечь объекты Part данного запроса multipart/form-data​​, вызвав запрос request.getPart(String name) или request.getParts().

Аннотация @MultipartConfig

Аннотация @MultipartConfig поддерживает следующие необязательные атрибуты.

  • location: абсолютный путь к каталогу в файловой системе. Атрибут location не поддерживает путь относительно контекста приложения. Это расположение используется для врéменного хранения файлов во время обработки деталей или когда размер файла превышает заданный параметр fileSizeThreshold. Расположение по умолчанию: "".

  • fileSizeThreshold: размер файла в байтах, после которого файл будет временно сохранён на диске. Размер по умолчанию составляет 0 байт.

  • MaxFileSize: максимально допустимый размер загружаемых файлов в байтах. Если размер любого загруженного файла больше этого размера, веб-контейнер выдаст исключение (IllegalStateException). Размер по умолчанию не ограничен.

  • maxRequestSize: максимальный размер, разрешённый для запроса multipart/form-data​​, в байтах. Веб-контейнер выдаст исключение, если общий размер всех загруженных файлов превысит этот порог. Размер по умолчанию не ограничен.

Например, аннотация @MultipartConfig может быть построена следующим образом:

@MultipartConfig(location="/tmp", fileSizeThreshold=1024*1024,
    maxFileSize=1024*1024*5, maxRequestSize=1024*1024*5*5)

Вместо использования аннотации @MultipartConfig для жёсткого кодирования (hard-code) этих атрибутов в вашем сервлете загрузки файлов, вы можете добавить следующее как дочерний элемент элемента конфигурации сервлета в файл web.xml:

<multipart-config>
    <location>/tmp</location>
    <max-file-size>20848820</max-file-size>
    <max-request-size>418018841</max-request-size>
    <file-size-threshold>1048576</file-size-threshold>
</multipart-config>

Методы getParts и getPart

Спецификация сервлета поддерживает два дополнительных метода HttpServletRequest:

  • Collection<Part> getParts()

  • Part getPart(String name)

Метод request.getParts() возвращает коллекции всех объектов Part. Если у вас на странице есть более одного элемента ввода файла, возвращается несколько объектов Part. Поскольку объекты Part имеют имена, метод getPart(String name) можно использовать для доступа к определённому Part. Кроме того, метод getParts(), который возвращает Iterable<Part>, может использоваться для получения Iterator по всем объектам Part.

Интерфейс javax.servlet.http.Part прост и предоставляет методы, которые позволяют выполнять внутренний анализ каждого Part. Методы позволяют делать следующее:

  • получить имя, размер и тип содержимого для Part;

  • запросить заголовки, отправленные с Part;

  • удалить Part;

  • записать Part на диск.

Например, интерфейс Part предоставляет метод write(String filename) для записи файла с указанным именем. Затем файл можно сохранить в каталоге, указанном с помощью атрибута location аннотации @MultipartConfig или, в случае fileupload, в месте, указанном в поле «Назначение» формы.


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)