跳转到内容

XForms/上传

来自维基教科书,自由的教学读物

上传元素允许您使用操作系统的“浏览”用户界面从文件系统中选择文件。然后,该文件可以传输到 Web 表单所在的服务器。

屏幕图像

[编辑 | 编辑源代码]

以下是 Firefox XForms 扩展上传控件在选择 C:\tmp\Foo.xml 文件后的屏幕图像

XForms upload 元素

[编辑 | 编辑源代码]
<xf:upload ref="XPathExpression" mediatype="text/xml">
  <xf:filename ref="XPathExpression" />
  <xf:mediatype ref="XPathExpression" />
</xf:upload>

示例程序

[编辑 | 编辑源代码]

此示例程序具有一个名为“File”的单个实例变量。在选择结束时,此变量将设置为刚刚选择的文件的路径名。

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:xf="http://www.w3.org/2002/xforms"
    xmlns:ev="http://www.w3.org/2001/xml-events"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
   <head>
       <title/>
       <xf:model>
           <xf:instance xmlns="">
               <Data>
                   <File xsi:type="xs:anyURI"/>
               </Data>
           </xf:instance>
       </xf:model>
   </head>
   <body>
       <xf:upload ref="/Data/File">
           <xf:filename>file:///C:/tmp/*.xml</xf:filename>
           <xf:mediatype>text/xml</xf:mediatype>
       </xf:upload>
       <br/>
       <xf:output ref="/Data/File">
          <xf:label>File: </xf:label>
       </xf:output>
   </body>
</html>

在撰写本文时,关于上传控件如何工作的文档很少。上面的屏幕截图来自在 Firefox 3 上运行的 Firefox XForms 0.8 实现。请注意,文件名在控件本身中出现两次。这可能不是将来的行为。这可能是因为控件内的文件名和媒体类型文本正在被显示。目前还没有关于如何禁用清除触发器的文档。

目前还没有关于如何使用上传控件将实例数据上传到模型的文档。现在,实例数据必须硬编码到实例的 src 属性中。

以下加载图像和 URI。

<html xmlns="http://www.w3.org/1999/xhtml" 
xmlns:ev="http://www.w3.org/2001/xml-events" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:xf="http://www.w3.org/2002/xforms" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <head>
        <title/>
        <xf:model>
            <xf:instance xmlns="">
                <data>
                    <image xsi:type="xs:base64Binary"/>
                    <uri xsi:type="xs:anyURI"/>
                </data>
            </xf:instance>
            <xf:submission id="save" action="http://xformstest.org/cgi-bin/showinstance.sh" method="post"/>
        </xf:model>
    </head>
    <body>
        <xf:upload ref="image">
            <xf:label>Upload Photo:</xf:label>
        </xf:upload>
        <br/>
        <xf:upload ref="uri">
            <xf:label>Upload File:</xf:label>
            <xf:filename>file:///C:/tmp/*.xml</xf:filename>
            <xf:mediatype>text/xml</xf:mediatype>
        </xf:upload>
        <br/>
        <xf:output ref="image">
            <xf:label>image: </xf:label>
        </xf:output>
        <br/>
        <xf:output ref="uri">
            <xf:label>uri: </xf:label>
        </xf:output>
        <br/>
        <xf:submit submission="save">
            <xf:label>Save</xf:label>
        </xf:submit>
    </body>
</html>

上传二进制文件

[编辑 | 编辑源代码]

任何文件类型(如图像或 XML 文件)都可以转换为 64 位编码文件,存储在实例中,然后在 POST 中传输到服务器。在服务器上,该文件可以转换回字符串或二进制文件。

带有二进制到字符串解码的示例回声

[编辑 | 编辑源代码]

以下是使用 XQuery 编写的简单回声脚本,它以 XML 格式回显二进制文件。它是一个使用二进制到字符串转换函数的 XQuery 脚本。它接受一个类型为 xs:base64binary 的文件,并返回文件的字符串表示形式。要返回的数据在元素名称为“xml-base64”的元素中。

   xquery version "1.0";
   declare option exist:serialize "method=xml media-type=text/xml indent=yes"; 

   (: this gets the data from the HTTP POST :)
   let $post-data := request:get-data()
(: this converts the base-64 binary to a plaintext string that holds the unparsed XML content :)
   let $xml-as-string := util:base64-decode($post-data//xml-base64)
   let $parsed-xml := util:parse($xml-as-string)

   return
   <results>
      <xml-as-string>{$xml-as-string}</xml-as-string>
      <parsed-xml>{$parsed-xml}</parsed-xml>
   </results>

示例表单

[编辑 | 编辑源代码]
<html 
    xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:xf="http://www.w3.org/2002/xforms"
    xmlns:ev="http://www.w3.org/2001/xml-events"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    >
    <head>
        <title>Upload XML</title>
        <xf:model>
            <xf:instance xmlns=''>
                <data>
                    <xml-base64 xsi:type="xs:base64Binary"/>
                </data>
            </xf:instance>
            
            <xf:submission id='post-to-echo' 
                action='echo-base64-binary.xq' replace="all"
                method='post'/>
            
        </xf:model>
    </head>
    <body>
        <br/>
        
        <xf:upload ref="xml-base64">
            <xf:label>Upload XML File:</xf:label>
        </xf:upload>
        
        <br/>
        <xf:output ref="xml-base64">
            <xf:label>XML file encoded in base64binary: </xf:label>
        </xf:output>
        <br/>
        
        <xf:submit submission="post-to-echo">
            <xf:label>Post to Echo</xf:label>
        </xf:submit>
        
    </body>
</html>

示例文件

[编辑 | 编辑源代码]
<test>This is a small XML file.</test>

属性数据类型分配 xsi:type="xs:anyURI" 必须与用于存储文件路径名的变量相关联。

参考资料

[编辑 | 编辑源代码]


下一页: 触发器 | 上一页: 格式化日期
首页: XForms
华夏公益教科书