XForms/上传
外观
< XForms
上传元素允许您使用操作系统的“浏览”用户界面从文件系统中选择文件。然后,该文件可以传输到 Web 表单所在的服务器。
以下是 Firefox XForms 扩展上传控件在选择 C:\tmp\Foo.xml 文件后的屏幕图像
<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"
必须与用于存储文件路径名的变量相关联。