 | Уровень сложности: средний Николас Чейз, независимый автор
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 предоставляет способ задания файла для загрузки
Как указано атрибутом 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 при помощи XForms | perlupload_source.zip | 4KB | HTTP |
|---|
Ресурсы Научиться
- Оригинал статьи XForms tip: Use XForms to upload a file to Perl.
-
Прочитайте цикл учебных пособий developerWorks по программированию на PHP:
Изучение PHP, Часть 1, Изучение PHP, Часть 2 и
Изучение PHP, Часть 3.
- Пусть
Skimstone объяснит вам, что такое XForms.
- Посмотрите
Skimstone введение в XForms.
-
Посетите ресурсы по проекту PHP сайта developerWorks, чтобы узнать больше о PHP.
-
Чтобы больше узнать о других возможных типах схем ввода в XForms, прочитайте w3cschools.
-
Данный цикл является хорошим гидом для начала использования XForms.
- Начните с
этой ссылки, чтобы узнать больше о Visual XForms Designer от alphaWorks.
-
В
разделе XML на developerWorks Россия вы найдете ресурсы, необходимые для развития навыков в XForms и других XML-технологиях.
-
Посетите
магазин технической литературы, чтобы найти книги на эти и другие технические темы.
Получить продукты и технологии
-
Загрузите ActivePerl.
-
Получите MozzIE, элемент управления с открытым исходным кодом, который позволяет вам визуализировать XForms в IE.
Обсудить
Об авторе  | |  |
Николас Чейз (Nicholas Chase) разрабатывает Web-сайты для таких компаний как Lucent Technologies, Sun Microsystems, Oracle и Tampa Bay Buccaneers. Он работает школьным учителем по физике, менеджером по низкоуровневой утечке радиоактивности, редактором интерактивного журнала по научной фантастике, инженером мультимедийных средств, инструктором по Oracle, директором по технологии компании, специализирующейся на интерактивных взаимодействиях. Является автором нескольких книг, включая "XML Primer Plus". |
Выскажите мнение об этой странице
|  |