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

developerWorks Россия  >  XML  >

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

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

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

Обсудить

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


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

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


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

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

09.07.2007

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

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

Этот совет создан для конкретной задачи. Для дополнительной информации по 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>
    <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. Текстовое представление
Текстовое представление

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



В начало


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

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


Листинг 3. Извлечение файла
                
<?php

if (!isset($HTTP_RAW_POST_DATA))
   $HTTP_RAW_POST_DATA = file_get_contents("php://input");

$doc = new DOMDocument();
$doc->loadXML($HTTP_RAW_POST_DATA);

$imageFiles = $doc->getElementsByTagName('imageFile');

header("Content-type: text/html");

for($i = 0; $i < $imageFiles->length; $i++){

    $imageFileData = $imageFiles->item($i);
    if
       (strlen($imageFileData->nodeValue) >0){
       $filename = $imageFileData->getAttribute('fileName');
       print "Saving ".$filename."<br />";

       $fh = fopen($filename, 'w');
       fwrite($fh, base64_decode($imageFiles->item(0)->nodeValue));
       fclose($fh);
       print "<img src='".$filename."' width='200' />";
    }

}
print "<br />Done.";
?>

Первый шаг совершенно простой: во-первых, вы извлекаете присланные исходные данные, а затем анализируете их как документ DOM, как вы поступили бы с любой другой строкой. Отсюда вы можете извлечь элементы imageFile.

Теперь будет несколько сложнее. Во-первых, вы выводите заголовок Content-type не для файла, а для всего ответа, отсылаемого обратно в браузер. Таким образом, вы можете видеть, что происходит. Далее вы просматриваете каждый из элементов imageFile. Эти элементы существуют независимо от того, содержатся ли в них данные - таким же образом вы создали экземпляр документа - поэтому они будут присутствовать, даже если не содержат никаких данных. По этой причине вы проверяете, есть ли в них действительно какие-либо данные, и если есть - то обрабатываете их.

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

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


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


В начало


Заключение

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




В начало


Загрузка

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


Ресурсы

Научиться

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


Обсудить


Об авторе

No bio.




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


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



ДаНетНе знаю
 


 


12345
 


В начало


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

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