热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

应用XML技巧上传文件的例子

本文讲解了一个应用XML技巧上传文件的例子,应用该方法没有传统方法中的种种限制。这个例子讲述了如何应用MSXML3.0和ADOStream对象来实现这种新的上传方法。利益有很多,比如,不需

本文讲解了一个应用XML技巧上传文件的例子,应用该方法没有传统方法中的种种限制。 这个例子讲述了如何应用MSXML3.0和ADO Stream对象来实现这种新的上传方法。利益有很多,比如,不需要专用的上传组件。

引言

为了在HTML网页中获得上传功效,在客户端我们可以应用如下格局的FORM:

ENCTYPE="multipart/form-data"
METHOD="post">


这种计划在客户端和服务器真个应用都有很多限制。首先,我们必需应用POST方法,由于GET方法无法处理这样的表单数据。并且,没有什么方法可以在不应用表单的情况下引发一个POST动作。把数据发送给表单处理程序后,浏览器将会把处理程序作为新页面加载,然后应用者会看到一个不讨人爱好的页面转换过程。

ENCTYPE属性为表单定义了MIME编码方法,上传文件的表单的ENCTYPE属性必需应用“multipart/form-data”。把这个属性设置为“multipart/form-data”就创立了一个与传统结构不同的POST缓冲区(复合结构),ASP的Request对象无法拜访这样的表单内容。所以,我们可以应用Request.binaryRead方法来拜访这些数据,但是无法应用脚本语言来完成这一切。Request.binaryRead方法返回一个VTarray型数据(只包含无符号一字节字符的Variant型数组)。但是脚本语言只能处理Variant型数据。为懂得决这个标题,只能应用专用的ASP上传组件,或者ISAPI扩大程序,比如CPSHOST.DLL。这是设计上的限制。

新的上传计划

需要按照如下步骤把持。

客户端:

应用MSXML 3.0创立一个XML文档

创立一个针对二进制内容的XML节点

应用ADO Stream object将上传的文件数据放进该节点

应用XMLHTTP对象把这个XML文档发送给Web服务器

服务器端:

从Request对象中读出XML文档

读出二进制节点中的数据并且存储到服务器上的文件中。当然,我们也可以将其存储到数据库的BLOB型字段中。

在说明这段代码之前,我们可以对这个计划进行一些思考。

对XML的思考

XML格局支撑很多数据类型,比如numeric, float, character等等。很多作者将XML定义为ASCII格局,但是我们不能疏忽,XML技巧还可以应用“bin.base64”数据类型来描写二进制信息。这个特征在MS XML3.0解析器重得到完整的支撑,但是目前还需要一些特别设置。该对象供给一些可以对二进制数据进行完整把持的属性:

obj_node.dataType - 该可读写的属性定义了特定节点的数据类型。MSXML解析器支撑更多的数据类型(参见MSDN:http://msdn.microsoft.com/library/psdk/xmlsdk/xmls3z1v.htm)

对于二进制数据,我们可以应用“bin.base64”类型。

obj_node.nodeTypedValue - 该可读写属性包含了按照制定类型表现的指定节点的数据。

我们可以创立一个包含多个bin.base64类型节点的XML文档,节点中包含上传的文件。这点特征可以应用一个POST一次上传多个文件。

我们可以应用XMLHttpRequest对象和POST方法发送一个XML文档给Web服务器。该对象为HTTP服务器供给了客户端协议支撑,答应在Web服务器上发送和接收MS XMLDOM对象。XMLHttpRequest是Internet Explorer 5内置的COM对象(不需要定制安装),并且发送完毕后无需转换页面。

对ADO Stream对象的思考

我们可以在客户端创立一个包含一个或者多个二进制节点的XML文档。我们还必需把文件内容填进节点中。但是很不幸,脚本语言不能拜访本地文件系统,并且Scripting.FileSystem对象(是Win32系统的内置对象)到目前为止还不能拜访二进制文件。这是设计上的限制。所以我们需要另外找一个可以供给对本地二进制文件的拜访的COM对象。

ADO Stream对象(MDAC 2.5中的组件)供给了读、写和治理二进制流数据的手段。字节流的内容可以是文本,或者二进制数据,并且没有容量上的限制。在ADO 2.5中,Microsoft对Stream对象的先容不属于ADO对象结构的任何一层,所以,我们无需***即可应用该对象。

本文中应用Stream对象来拜访文件内容,再把内容存进XML节点。

客户端

以下示例代码应用Stream和MSXML对象完成文件上传动作。





Ready




// 上传函数
function btn_send.onclick()
{
// 创立 ADO-stream 对象
var ado_stream = new ActiveXObject("ADODB.Stream");
// 创立包含默认头信息和根节点的 XML文档
var xml_dom = new ActiveXObject("MSXML2.DOMDocument");
xml_dom.loadXML(' ');
// 指定数据类型
xml_dom.documentElement.setAttribute("xmlns:dt", "urn:schemas-microsoft-com:datatypes");
// 创立一个新节点,设置其为二进制数据节点
var l_node1 = xml_dom.createElement("file1");
l_node1.dataType = "bin.base64";
// 打开Stream对象,读源文件
ado_stream.Type = 1; // 1=adTypeBinary
ado_stream.Open();
ado_stream.LoadFromFile("c:tmpmyfile.doc");
// 将文件内容存进XML节点
l_node1.nodeTypedValue = ado_stream.Read(-1); // -1=adReadAll
ado_stream.Close();
xml_dom.documentElement.appendChild(l_node1);
// 可以创立多个二进制节点,一次上传多个文件
// 把XML文档发送到Web服务器
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("POST","./file_recieve.asp",false);
xmlhttp.send(xml_dom);
// 显示服务器返回的信息
div_message.innerHTML = xmlhttp.ResponseText;
}
《SCRIPT》

服务器端

以下代码应用雷同的对象供给服务器真个上传处理功效。

<%@ LANGUAGE=Vbscript%>
<% Option Explicit
Response.Expires = 0
' 定义变量和对象。
dim ado_stream
dim xml_dom
dim xml_file1
' 创立 Stream 对象
set ado_stream = Server.CreateObject("ADODB.Stream")
' 从Request对象创立 XMLDOM对象
set xml_dom = Server.CreateObject("MSXML2.DOMDocument")
xml_dom.load(request)
' 读出包含二进制数据的节点
set xml_file1 = xml_dom.selectSingleNode("root/file1")
' 打开Stream对象,把数据存进其中
ado_stream.Type = 1 ' 1=adTypeBinary
ado_stream.open
ado_stream.Write xml_file1.nodeTypedValue
' 文件存盘
ado_stream.SaveToFile "c:mpupload1.doc",2 ' 2=adSaveCreateOverWrite
ado_stream.close
' 烧毁对象
set ado_stream = Nothing
set xml_dom = Nothing
' 向浏览器返回信息
Response.Write "Upload successful!"
%>

也可以应用Stream对象把数据放到数据库的BLOB型字段中。

应用该方法的益处

不引起页面转换。

不需要专用组件。

推荐阅读
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 深入解析Tomcat:开发者的实用指南
    深入解析Tomcat:开发者的实用指南 ... [详细]
  • 如何在Java中高效构建WebService
    本文介绍了如何利用XFire框架在Java中高效构建WebService。XFire是一个轻量级、高性能的Java SOAP框架,能够简化WebService的开发流程。通过结合MyEclipse集成开发环境,开发者可以更便捷地进行项目配置和代码编写,从而提高开发效率。此外,文章还详细探讨了XFire的关键特性和最佳实践,为读者提供了实用的参考。 ... [详细]
  • HTTP请求与响应机制:基础概览
    在Web浏览过程中,HTTP协议通过请求和响应报文实现客户端与服务器之间的通信。当用户访问一个网页时,浏览器会发送一个HTTP请求报文至服务器,服务器接收到请求后,会生成并返回一个HTTP响应报文。这两种报文均包含三个主要部分:起始行、头部字段和消息体,确保了数据的有效传输和解析。 ... [详细]
  • 通过自定义 `TextView`,实现了在用户点击或焦点变化时动态调整字体颜色的效果。该方法利用了 `ColorStateList` 和 `Selector` 资源文件,确保了界面交互的流畅性和视觉效果的提升。具体实现中,通过重写 `onTouchEvent` 和 `onFocusChanged` 方法,精确控制了颜色变化的时机和状态。此外,还对性能进行了优化,确保在高频率操作下依然保持高效响应。 ... [详细]
  • 来宾 | Vmware ESXi 平台下的虚拟机在线管理与技术支持
    来宾 | Vmware ESXi 平台下的虚拟机在线管理与技术支持 ... [详细]
  • 在Linux环境下,本文详细探讨了Apache服务器中CGI技术的应用与实现。首先,通过使用yum包管理器安装了必要的软件,如PHP。安装完成后,对Apache服务器进行了配置,确保CGI功能正常运行。此外,还介绍了如何编写和调试CGI脚本,以及如何在实际环境中部署这些脚本以提供动态网页内容。实验结果表明,通过合理的配置和优化,Apache服务器能够高效地支持CGI应用程序,为用户提供丰富的交互体验。 ... [详细]
  • 使用cpphttplib构建HTTP服务器以处理带有查询参数的URL请求 ... [详细]
  • 本文详细介绍了如何在 Grafana 中独立于 Alertmanager 配置邮件和微信告警。具体步骤包括配置 SMTP 服务器以实现邮件告警,以及设置微信告警的集成方式。通过这些配置,用户可以更灵活地管理和接收来自 Grafana 的告警通知,确保及时响应系统异常。文章还提供了详细的配置示例和常见问题的解决方案,帮助用户顺利完成设置。 ... [详细]
  • 在《PHP应用性能优化实战指南:从理论到实践的全面解析》一文中,作者分享了一次实际的PHP应用优化经验。文章回顾了先前进行的一次优化项目,指出即使系统运行时间较长后出现的各种问题和性能瓶颈,通过采用一些通用的优化策略仍然能够有效解决。文中不仅详细阐述了优化的具体步骤和方法,还结合实例分析了优化前后的性能对比,为读者提供了宝贵的参考和借鉴。 ... [详细]
  • 期末Web开发综合实践项目:运用前端技术打造趣味小游戏体验
    期末Web开发综合实践项目中,学生通过运用HTML、CSS和JavaScript等前端技术,设计并实现了一款趣味性十足的小游戏。该项目不仅检验了学生对前端基础知识的掌握情况,还提升了他们的实际操作能力和创意设计水平。视频链接展示了项目的最终成果,直观呈现了游戏的互动性和视觉效果。 ... [详细]
  • 如何将PHP文件上传至服务器及正确配置服务器地址 ... [详细]
  • 本文介绍了使用 Python 编程语言高效抓取微博文本和动态网页图像数据的方法。通过详细的示例代码,展示了如何利用爬虫技术获取微博内容和动态图片,为数据采集和分析提供了实用的技术支持。对于对网络数据抓取感兴趣的读者,本文具有较高的参考价值。 ... [详细]
  • 负载均衡基础概念与技术解析
    随着互联网应用的不断扩展,用户流量激增,业务复杂度显著提升,单一服务器已难以应对日益增长的负载需求。负载均衡技术应运而生,通过将请求合理分配到多个服务器,有效提高系统的可用性和响应速度。本文将深入探讨负载均衡的基本概念和技术原理,分析其在现代互联网架构中的重要性及应用场景。 ... [详细]
author-avatar
mobiledu2502863683
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有