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

developerWorks Россия  >  XML  >

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

Совет по XForms

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

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

Обсудить

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


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

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


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

Николас Чейз, независимый автор

06.07.2007

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

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

Этот совет создан для конкретной задачи. Для дополнительной информации по 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 cake platter</description>
    <estimatedValue>N/A</estimatedValue>
    <imageFile xsi:type="xsd:base64Binary" fileName="image2.jpg"/>
  </auctionItem>
  <auctionItem itemID="5">
...
  </auctionItem>
</auctionItems>

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

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



В начало


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

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. Текстовое представление
Текстовое представление

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



В начало


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

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


Листинг 3. Код Perl
                
#!c:/usr/bin/perl.exe
use warnings;
use strict;
use XML::Simple;
use XML::Parser;
use CGI qw(:standard);
use CGI::Carp qw(fatalsToBrowser);
use MIME::Base64::Perl;

print "Content-type: text/html\n\n";

my $xmlData = param('POSTDATA');
my $xml = new XML::Simple;
my $data = $xml->XMLin($xmlData);

my @items = $data->{auctionItems}->{auctionItem};
print "<h1>Saving files</h1>";
my $i;

for($i = 0; $i <= @items; $i++){

   my $filename = 
$data->{auctionItem}->[$i]->{imageFile}->{fileName};
   print "Saving ".$filename.".<br />";

   open (MYFILE, ">>".$filename);
   binmode MYFILE;
   print MYFILE 
decode_base64($data->{auctionItem}->[$i]->{imageFile}->{content});
   close (MYFILE);

   print "<img src='".$filename."' width='200' /><br />";

}

Во-первых, вы установили Content-type зависящим от text/HTML, чтобы видеть результаты. Далее, вы получили сам XML-документ из параметра POSTDATA. Отсюда вы подаете XML-документ в анализатор, создав документ, из которого вы можете извлечь массив из элементов auctionItems.

Для каждого из этих элементов вы извлекаете желаемое имя файла и используете его для создания нового файла, в который вы будете записывать. Убедитесь, что установлен бинарный режим, иначе бинарные файлы, такие как рисунки, не будут отображаться должным образом. Далее мы записываем данные.

Вы не можете просто записать данные в файл, потому что это не бинарные данные, которых вы, возможно, ждете; это текстовое представление, перекодированное как Base64, поэтому вам следует использовать метод decode_base64() модуля MIME::Base64 для обратного декодирования текста в бинарные данные. В ActivePerl он уже есть, а если нет, то в разделе Ресурсы вы найдете ссылку для его загрузки. Записав данные на диск, вы можете закрыть файл.

Теперь вы создаете HTML-тег, который отображает рисунок, чтобы вы могли видеть, что было сделано. В результате мы получим страницу, похожую на рисунок 3.


Рисунок 3. Просмотр файла
Просмотр файла


В начало


Заключение

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




В начало


Загрузка

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


Ресурсы

Научиться

Получить продукты и технологии
  • Загрузите ActivePerl.

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


Обсудить


Об авторе

Николас Чейз (Nicholas Chase) разрабатывает Web-сайты для таких компаний как Lucent Technologies, Sun Microsystems, Oracle и Tampa Bay Buccaneers. Он работает школьным учителем по физике, менеджером по низкоуровневой утечке радиоактивности, редактором интерактивного журнала по научной фантастике, инженером мультимедийных средств, инструктором по Oracle, директором по технологии компании, специализирующейся на интерактивных взаимодействиях. Является автором нескольких книг, включая "XML Primer Plus".




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


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



ДаНетНе знаю
 


 


12345
 


В начало


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

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