IBM®
Перейти к тексту
    в России и странах СНГ [изменить]    Условия использования
 
 
   
    Главная страница    Продукты    Услуги и решения    Поддержка и загрузка    Мой профиль    
Перейти к тексту

developerWorks Россия  >  XML  >

Совет по XForms: Использование XForms для загрузки файла в Java

developerWorks
Опции документа

Опции документа, требующие включения JavaScript, не отображаются

Обсудить

Исходные тексты примера


Выскажите мнение об этой странице

Помогите нам улучшить содержание


Уровень сложности: средний

Тайлер Андерсон, Независимый автор, Stexar Corp.

05.07.2007

Загрузка файлов - довольно распространенная задача при использовании HTML-форм, но как это сделать в XForms, где данные сохраняются как часть XML-документа? Эта статья объясняет, как создать форму XForms, которая дает возможность пользователю загрузить файл и объясняет, как создать Java™-сервлет, который сохраняет файл на сервере, когда он приходит.

Прежде, чем вы начнете: замечания по этой статье

Эта статья создана для решения конкретной задачи. Для дополнительной информации по XForms читайте цикл из трех статей Введение в XForms.

Примеры XForms, описанные в данной статье, протестированы и работают с браузерами Firefox 1.5 (с установленным расширением XForms) и Microsoft® Internet Explorer 6 с установленным элементом управления Formsplayer. Раздел загрузка содержит XHTML-файл для Firefox и HTML-файл для IE.



В начало


Данные

При работе с формой XForms, первый шаг - это определить структуру данных, с которыми работаете. Посмотрите образец XML-документа, который отслеживает предметы, приобретенные на аукционе, и содержит элемент, в котором хранится фотография (см. листинг 1).


Листинг 1. Данные
                
<auctionItems  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <auctionItem itemID="2">
    <purchaseDate>2006-09-18</purchaseDate>
    <auctionLength>600</auctionLength>
    <purchasePrice>10</purchasePrice>
    <description>Vintage hair dryer</description>
    <estimatedValue>N/A</estimatedValue>
    <dataFile xsi:type="xsd:base64Binary"></dataFile>
  </auctionItem>
  <auctionItem itemID="5">
    <purchaseDate>2006-09-18</purchaseDate>
    <auctionLength>300</auctionLength>
    <purchasePrice>4</purchasePrice>
    <description>Box Lot</description>
    <estimatedValue>N/A</estimatedValue>
    <dataFile xsi:type="xsd:base64Binary"></dataFile>
  </auctionItem>
</auctionItems>

Важная часть данного экземпляра документа - это элемент dataFile, который будет хранить данные, представляющие файл с рисунком, после того, как пользователь подтвердит его. Этот элемент указывает, что данные, который он содержит - это данные Base64Binary. Base64 предоставляет способ кодирования двоичных данных в текст с тем, чтобы он мог быть включен в XML-документ. Когда документ дойдет до адреса назначения (в данном случае - это Web-сервер), вы можете декодировать Base64, чтобы получить исходные бинарные данные. Это делает его идеальным для передачи файлов-изображений.

Но как это сделать в форме?



В начало


Добавление элемента управления к форме.

XForms предусматривает элемент управления upload, поэтому добавить эту возможность к форме совершенно просто (см. листинг 2).


Листинг 2. Добавление элемента управления upload
                

<?xml version="1.0" encoding="ASCII"?>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ev="http://www.w3.org/2001/xml-events"
      xmlns:xforms="http://www.w3.org/2002/xforms">
  <head>
    <title>Instance Data-To-XHTML/XForms Example</title>

    <xforms:model id="auctionItems">
      <xforms:instance src="auctions.xml"/>
      <xforms:submission id="submit_model_auctionItems"
                         action="http://xformstest.org/cgi-bin/showinstance.sh"
                         method="post"/>
    </xforms:model>
    <link href="gen_default.css" rel="stylesheet"/>
  </head>
  <body>
    
    <h1 align="center">Auction Item Inventory</h1>
    
    <xforms:repeat nodeset="auctionItem" id="repeatAuctionItems">
      <h2 align="center">Auction Item</h2>
      <xforms:input ref="@itemID">
        <xforms:label>Item ID</xforms:label>
      </xforms:input>
      <xforms:input ref="purchaseDate">
        <xforms:label>Purchase Date</xforms:label>
      </xforms:input>
      <xforms:input ref="auctionLength">
        <xforms:label>Auction Length</xforms:label>
      </xforms:input>
      <xforms:input ref="purchasePrice">
        <xforms:label>Purchase Price</xforms:label>
      </xforms:input>
      <xforms:input ref="description">
        <xforms:label>Description</xforms:label>
      </xforms:input>
      <xforms:input ref="estimatedValue">
        <xforms:label>Estimated Value</xforms:label>
      </xforms:input>

      <xforms:upload ref="imageFile">
                     <xforms:label>Upload Data File</xforms:label>
                  </xforms:upload>

    </xforms:repeat>

    <xforms:group>
      <xforms:trigger>
        <xforms:label>Insert Auction Item</xforms:label>
        <xforms:insert nodeset="auctionItem" at="index('repeatAuctionItems')"
                       position="after" ev:event="DOMActivate" />
      </xforms:trigger>
      <xforms:trigger>
        <xforms:label>Delete Auction Item</xforms:label>
        <xforms:delete nodeset="auctionItem" at="index('repeatAuctionItems')"
                       ev:event="DOMActivate" />
      </xforms:trigger>
    </xforms:group>

    <xforms:submit submission="submit_model_auctionItems">
      <xforms:label>Submit</xforms:label>
    </xforms:submit>

  </body>
</html>

Элемент управления upload предоставляет способ задания файла для загрузки, как можно увидеть на рисунке 1.


Рисунок 1. Элемент управления upload предоставляет способ задания файла для загрузки
 Элемент управления upload предоставляет способ задания файла для загрузки

Как указано в атрибуте ref, данные сохраняются в элементе imageFile. Если вы подтвердили форму, вы можете посмотреть текстовое представление, показанное на рисунке 2.


Рисунок 2. Текстовое представление
Текстовое представление

Но как вы извлечете данные, когда они придут на сервер?



В начало


Извлечение данных

Извлечение данных в Java - это дело анализа XML-документа, возвращенного формой, как можно увидеть из листинга 3.


Листинг 3. Фрагмент Java-сервлета
                
...
            javax.xml.parsers.DocumentBuilderFactory docBuildFact =
                javax.xml.parsers.DocumentBuilderFactory.newInstance();
            docBuildFact.setIgnoringElementContentWhitespace(true);

            javax.xml.parsers.DocumentBuilder docBuild =
                docBuildFact.newDocumentBuilder();
    
            ServletInputStream in = request.getInputStream();
            org.w3c.dom.Document doc = docBuild.parse(in);
            in.close();

            org.w3c.dom.NodeList dataFiles =
                doc.getElementsByTagName("dataFile");

            for(int i = 0; i < dataFiles.getLength(); i++){
                org.w3c.dom.Node data = dataFiles.item(i);
                byte[] decodedData = 
                    Base64.decode(data.getTextContent());
                FileOutputStream fos =
                    new FileOutputStream
                    ("C:/apps/webapps/javaXforms/file"+i+".jpg");
                fos.write(decodedData);
                fos.close();
            }
...

Чтобы создать конструктор документов, сначала нужно создать фабрику конструкторов документов. После создания конструктора, вы сможете загрузить request.getInputStream() XML в объект документа DOM. Затем извлеките все файлы с данными или рисунками по имени тега dataFile. Далее просмотрите каждый узел (Node) в в списке NodeList и декодируйте данные, используя Base64.decode(). Далее вы создаете файл FileOutputStream, записываете бинарные данные, а после закрываете FileOutputStream .

Обратите внимание, что код в листинге 3 использует Base64, который вы можете загрузить здесь, в качестве Base 64decoder .

Однако прежде чем использовать форму XForms, необходимо изменить тег submission в форме, чтобы загруженные файлы отсылались в Java-сервлет, как показано в листинге 4.


Листинг 4. Изменение тега submission.
                
      <xforms:submission id="submit_model_auctionItems"
              action="http://localhost:8080/upload/xformsJava.jsp"
              method="post"/>

После подтверждения формы она будет отослана на сервлет, а сервлет сохранит файлы в C:/apps/webapps/javaXforms/file0.jpg и C:/apps/webapps/javaXforms/file1.jpg. Вы можете изменить целевой каталог, в который записываются файлы, чтобы проверить себя.



В начало


Краткий обзор

Подобно традиционным Web-формам, XForms предоставляет возможность загрузки файлов, однако данные хранятся в Base64, поэтому вам надо декодировать их, перед тем как что-либо с ними делать. Однако как только вы это сделали, вы можете просто сохранить файл на локальной машине и отослать обратно пользователю, если хотите.




В начало


Загрузка

ОписаниеИмяРазмерМетод загрузки
Примеры для загрузки в Java при помощи XFormsuploadjava_source.zip33KBHTTP
Информация о методах загрузки


Ресурсы

Научиться

Получить продукты и технологии
  • Получите MozzIE, элемент управления с открытым кодом, который позволяет вам визуализировать XForms в IE.

  • Загрузите Base64 декодер здесь.


Обсудить


Об авторе

Тайлер Андерсон (Tyler Anderson) прежде работал в DPMG.com, SEO-компании, для которой он писал программное обеспечение. Получил диплом по вычислительной технике в Brigham Young University в 2004 и степень магистра наук по вычислительной технике в декабре 2005, тоже в Brigham Young University. В настоящее время работает инженером в компании Stexar Corp., расположенной в Beaverton, Oregon. Вы можете связаться с ним по адресу tyleranderson5@yahoo.com.




Выскажите мнение об этой странице


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



ДаНетНе знаю
 


 


12345
 


В начало


IBM обладает всеми авторскими правами касательно информации, расположенной на developerWorks. Использование информации приведенной на этом ресурсе без явного письменного разрешения от IBM или первоначального автора запрещены. Если Вы желаете использовать информацию с developerWorks, пожалуйста воспользуйтесь регистрационной формой для того, чтобы связаться с нами запрос на использование материалов developerWorks Россия.

    IBM в России Конфиденциальность Контакты