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

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

Приложение fileupload

В примере fileupload, расположенном в каталоге tut-install/examples/web/servlet/fileupload/, показано, как реализовать и использовать функцию отправки файлов.

Пример Duke's Forest содержит более сложный пример, который загружает файл изображения и сохраняет его содержимое в базе данных.

Замечание:

За исключением случаев, когда прямо сказано иное, сайт и весь контент, предоставляемый на сайте или через него, предоставляются на условиях «как есть» и «по мере доступности». Oracle однозначно отказывается ото всех гарантий любого рода, явных или подразумеваемых, включая, помимо прочего, подразумеваемые гарантии товарной пригодности, пригодности для конкретной цели и отсутствия нарушений в отношении сайта и всего контента, предоставляемого на сайте или через сайт. Oracle не даёт никаких гарантий, что: (а) сайт или контент будут соответствовать вашим требованиям; (б) сайт будет доступен бесперебойно, своевременно, безопасно или без ошибок; (в) результаты, которые могут быть получены при использовании сайта или любого контента, размещённого на сайте или через сайт, будут точными или надёжными; (г) качество любого контента, приобретенного или полученного вами на сайте или через сайт, будет соответствовать вашим ожиданиям.

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

Здесь рассматриваются следующие темы:

Архитектура приложения fileupload

Приложение fileupload состоит из одного сервлета и HTML-формы, которая отправляет запрос на загрузку файла в сервлет.

Этот пример включает в себя очень простую HTML-форму с двумя полями, File и Destination. Тип file компонента ввода позволяет пользователю просматривать локальную файловую систему и выбирать файл. Когда файл выбран, он отправляется на сервер как часть запроса POST. В ходе этого процесса к форме с типом ввода file применяются два обязательных ограничения.

  • Атрибут enctype должен быть установлен в значение multipart/form-data.

  • Его метод должен быть POST.

Когда форма объявлена таким образом, весь запрос отправляется на сервер в закодированной форме. Затем сервлет использует свои собственные средства для обработки запроса, чтобы обработать входящие данные файла и извлечь файл из потока. Destination — это путь к каталогу, в котором файл будет сохранён на вашем компьютере. Клик кнопки «Загрузить» в нижней части формы отправляет данные в сервлет, который сохраняет файл в указанном месте.

Форма HTML в index.html выглядит следующим образом:

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>File Upload</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <form method="POST" action="upload" enctype="multipart/form-data" >
            File:
            <input type="file" name="file" id="file" /> <br/>
            Destination:
            <input type="text" value="/tmp" name="destination"/>
            </br>
            <input type="submit" value="Upload" name="upload" id="upload" />
        </form>
    </body>
</html>

Метод запроса POST используется, когда клиенту необходимо отправить данные на сервер как часть запроса, например, при загрузке файла или отправке заполненной формы. Метод запроса GET, напротив, отправляет на сервер только URL и заголовки, тогда как запросы POST также включают тело сообщения. Это позволяет отправлять на сервер данные произвольной длины любого типа. Поле заголовка в запросе POST обычно указывает тип MIME тела сообщения.

При отправке формы браузер передаёт содержимое, объединяя все части, причём каждая часть представляет поле формы. Части имеют такие же названия, как и соответствующие им элементы input и отделены друг от друга разделителями строк с именем border.

Вот как выглядят отправленные данные из формы fileupload после выбора файла sample.txt, который будет загружен из каталога tmp на локальной файловой системе:

POST /fileupload/upload HTTP/1.1
Host: localhost:8080
Content-Type: multipart/form-data;
boundary=---------------------------263081694432439 Content-Length: 441
-----------------------------263081694432439
Content-Disposition: form-data; name="file"; filename="sample.txt"
Content-Type: text/plain
 Data from sample file
-----------------------------263081694432439
Content-Disposition: form-data; name="destination"
 /tmp
-----------------------------263081694432439
Content-Disposition: form-data; name="upload"
 Upload
-----------------------------263081694432439--

Сервлет FileUploadServlet.java начинается следующим образом:

@WebServlet(name = "FileUploadServlet", urlPatterns = {"/upload"})
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
    private final static Logger LOGGER =
            Logger.getLogger(FileUploadServlet.class.getCanonicalName());

Аннотация @WebServlet использует свойство urlPatterns для определения отображений сервлета.

Аннотация @MultipartConfig указывает, что сервлет ожидает выполнения запросов с использованием типа MIME multipart/form-data​.

Метод processRequest извлекает пункт назначения и файловую часть из запроса, затем вызывает метод getFileName для получения имени файла из файловой части. Затем метод создаёт FileOutputStream и копирует файл в указанное место. Раздел обработки ошибок метода ловит и обрабатывает некоторые из наиболее распространённых причин, по которым файл не будет найден. Методы processRequest и getFileName выглядят так:

protected void processRequest(HttpServletRequest request,
        HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");

    // Получение путь для сохранения файла
    final String path = request.getParameter("destination");
    final Part filePart = request.getPart("file");
    final String fileName = getFileName(filePart);

    OutputStream out = null;
    InputStream filecontent = null;
    final PrintWriter writer = response.getWriter();

    try {
        out = new FileOutputStream(new File(path + File.separator
                + fileName));
        filecontent = filePart.getInputStream();

        int read = 0;
        final byte[] bytes = new byte[1024];

        while ((read = filecontent.read(bytes)) != -1) {
            out.write(bytes, 0, read);
        }
        writer.println("New file " + fileName + " created at " + path);
        LOGGER.log(Level.INFO, "File{0}being uploaded to {1}",
                new Object[]{fileName, path});
    } catch (FileNotFoundException fne) {
        writer.println("You either did not specify a file to upload or are "
                + "trying to upload a file to a protected or nonexistent "
                + "location.");
        writer.println("<br/> ERROR: " + fne.getMessage());

        LOGGER.log(Level.SEVERE, "Problems during file upload. Error: {0}",
                new Object[]{fne.getMessage()});
    } finally {
        if (out != null) {
            out.close();
        }
        if (filecontent != null) {
            filecontent.close();
        }
        if (writer != null) {
            writer.close();
        }
    }
}

private String getFileName(final Part part) {
    final String partHeader = part.getHeader("content-disposition");
    LOGGER.log(Level.INFO, "Part Header = {0}", partHeader);
    for (String content : part.getHeader("content-disposition").split(";")) {
        if (content.trim().startsWith("filename")) {
            return content.substring(
                    content.indexOf('=') + 1).trim().replace("\"", "");
        }
    }
    return null;
}

Запуск примера fileupload

Вы можете использовать IDE NetBeans или Maven для сборки, упаковки, развёртывания и запуска примера fileupload.

Здесь рассматриваются следующие темы:

Сборка, упаковка и развёртывание примера fileupload с IDE NetBeans

  1. Удостоверьтесь, чтобы GlassFish Server был запущен (см. Запуск и остановка сервера GlassFish).

  2. В меню «Файл» выберите «Открыть проект».

  3. В диалоговом окне «Открыть проект» перейдите к:

    tut-install/examples/web/servlet
  4. Выберите каталог fileupload.

  5. Нажмите Открыть проект.

  6. На вкладке «Проекты» кликните правой кнопкой мыши проект fileupload и выберите «Сборка».

Сборка, упаковка и развёртывание примера fileupload с помощью Maven

  1. Удостоверьтесь, чтобы GlassFish Server был запущен (см. Запуск и остановка сервера GlassFish).

  2. В окне терминала перейдите в:

    tut-install/examples/web/servlet/fileupload/
  3. Введите следующую команду для развёртывания приложения:

    mvn install

Запуск примера fileupload

  1. В веб-браузере введите следующий URL:

    http://localhost:8080/fileupload/
  2. На странице загрузки файла нажмите «Выбрать файл», чтобы открыть окно браузера файлов.

  3. Выберите файл для загрузки и нажмите «Открыть».

    Имя выбранного файла отображается в поле «Файл». Если вы не выберете файл, будет сгенерировано исключение.

  4. В поле Destination введите имя каталога.

    Каталог должен быть уже создан и должен быть доступен для записи. Если вы не введёте имя каталога или если вы введёте имя несуществующего или защищённого каталога, возникнет исключение.

  5. Нажмите «Загрузить», чтобы загрузить выбранный файл в каталог, указанный в поле «Место назначения».

    Сообщение сообщает, что файл был создан в указанном вами каталоге.

  6. Перейдите в каталог, который вы указали в поле Destination, и убедитесь, что загруженный файл присутствует.


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