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

XML技巧上传文件

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

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


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

ACTION='TargetURL.asp'
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:\\tmp\\myfile.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:\tmp\upload1.doc',2 ' 2=adSaveCreateOverWrite
ado_stream.close

' 烧毁对象
set ado_stream = Nothing
set xml_dom = Nothing
' 向浏览器返回信息
Response.Write 'Upload successful!'
%>

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

应用该方法的益处

不引起页面转换。
不需要专用组件。
可同时上传多个文件。
这段程序是纯脚本写成的,可以很轻易的插进到其他代码中,而不需要任何HTML对象的配合。还可以把这个逻辑在任何支撑COM尺度的语言中实现。

系统安全考虑

该方法只能应用于内部网络,由于它需要IE5的安全级别设置为“低”。必需:

答应脚本和ActiveX对象。该设置答应浏览器履行类似 'myobj = new activexobject(...)'的 JScript语句;
必需答应穿越域拜访数据源。这个设置答应在客户端应用Stream对象。还必需在服务器和客户端都安装MS XML DOM 3.0 和MDAC 2.5 。


推荐阅读
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • 来宾 | Vmware ESXi 平台下的虚拟机在线管理与技术支持
    来宾 | Vmware ESXi 平台下的虚拟机在线管理与技术支持 ... [详细]
  • 如何将PHP文件上传至服务器及正确配置服务器地址 ... [详细]
  • 通过自定义 `TextView`,实现了在用户点击或焦点变化时动态调整字体颜色的效果。该方法利用了 `ColorStateList` 和 `Selector` 资源文件,确保了界面交互的流畅性和视觉效果的提升。具体实现中,通过重写 `onTouchEvent` 和 `onFocusChanged` 方法,精确控制了颜色变化的时机和状态。此外,还对性能进行了优化,确保在高频率操作下依然保持高效响应。 ... [详细]
  • 基于Java和JSP的电子医疗记录管理平台
    随着信息技术的快速发展,各类管理系统已在各行各业得到广泛应用。传统的人工管理模式已逐渐无法满足现代需求。本文介绍了一种基于Java和JSP技术开发的电子医疗记录管理平台,旨在提高医疗行业的信息化水平和管理效率。该平台通过整合先进的数据库技术和Web开发框架,实现了医疗记录的高效存储、查询和管理,为医护人员提供了便捷的操作界面和强大的数据支持。 ... [详细]
  • 如何在Windows 7旗舰版中高效打开CHM帮助文件
    如何在Windows 7旗舰版中高效打开CHM帮助文件 ... [详细]
  • 在Linux环境下,本文详细探讨了Apache服务器中CGI技术的应用与实现。首先,通过使用yum包管理器安装了必要的软件,如PHP。安装完成后,对Apache服务器进行了配置,确保CGI功能正常运行。此外,还介绍了如何编写和调试CGI脚本,以及如何在实际环境中部署这些脚本以提供动态网页内容。实验结果表明,通过合理的配置和优化,Apache服务器能够高效地支持CGI应用程序,为用户提供丰富的交互体验。 ... [详细]
  • 本文详细探讨了Java集合框架的使用方法及其性能特点。首先,通过关系图展示了集合接口之间的层次结构,如`Collection`接口作为对象集合的基础,其下分为`List`、`Set`和`Queue`等子接口。其中,`List`接口支持按插入顺序保存元素且允许重复,而`Set`接口则确保元素唯一性。此外,文章还深入分析了不同集合类在实际应用中的性能表现,为开发者选择合适的集合类型提供了参考依据。 ... [详细]
  • HTTP Referer 是 HTTP 请求头部的一个重要字段,用于标识请求的来源页面。这一信息对于网站分析和流量统计至关重要,能够帮助我们了解用户是如何到达当前页面的。通过对 Referer 的策略配置,可以有效提升网站的安全性和用户体验。 ... [详细]
  • 本文详细介绍了如何在 Grafana 中独立于 Alertmanager 配置邮件和微信告警。具体步骤包括配置 SMTP 服务器以实现邮件告警,以及设置微信告警的集成方式。通过这些配置,用户可以更灵活地管理和接收来自 Grafana 的告警通知,确保及时响应系统异常。文章还提供了详细的配置示例和常见问题的解决方案,帮助用户顺利完成设置。 ... [详细]
  • 在《PHP应用性能优化实战指南:从理论到实践的全面解析》一文中,作者分享了一次实际的PHP应用优化经验。文章回顾了先前进行的一次优化项目,指出即使系统运行时间较长后出现的各种问题和性能瓶颈,通过采用一些通用的优化策略仍然能够有效解决。文中不仅详细阐述了优化的具体步骤和方法,还结合实例分析了优化前后的性能对比,为读者提供了宝贵的参考和借鉴。 ... [详细]
  • 本文首先对信息漏洞的基础知识进行了概述,重点介绍了几种常见的信息泄露途径。具体包括目录遍历、PHPINFO信息泄露以及备份文件的不当下载。其中,备份文件下载涉及网站源代码、`.bak`文件、Vim缓存文件和`DS_Store`文件等。目录遍历漏洞的详细分析为后续深入研究奠定了基础。 ... [详细]
  • 期末Web开发综合实践项目:运用前端技术打造趣味小游戏体验
    期末Web开发综合实践项目中,学生通过运用HTML、CSS和JavaScript等前端技术,设计并实现了一款趣味性十足的小游戏。该项目不仅检验了学生对前端基础知识的掌握情况,还提升了他们的实际操作能力和创意设计水平。视频链接展示了项目的最终成果,直观呈现了游戏的互动性和视觉效果。 ... [详细]
  • 智能制造数据综合分析与应用解决方案
    在智能制造领域,生产数据通过先进的采集设备收集,并利用时序数据库或关系型数据库进行高效存储。这些数据经过处理后,通过可视化数据大屏呈现,为生产车间、生产控制中心以及管理层提供实时、精准的信息支持,助力不同应用场景下的决策优化和效率提升。 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
author-avatar
i_Screw_Robots
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有