我用vb xmlHttp做了个文件传输的例子,
自觉是个挺值得看的例子,所以贴出来和大家一起交流一下。
xml结构:
<?xml version='1.0'>
<boot><file1>文件以二进制方式存在这里</file1></boot>下面开始
Private Sub CreateAndTranXML()
Dim ado_stream As New ADODB.Stream
Dim xml_dom As New MSXML2.DOMDocument30
Dim strA As String, szFile As String, m_szUpFile As String
m_szUpFile = 'http://127.0.0.1/getupFile.asp' ‘server端的ASP接受程序
szFile = App.Path & '\temp.jpg' '要传送的jpg文件或任何文档
strA = '<?xml version=' & Chr(34) & '1.0' & Chr(34) & ' ?> <root/>'
xml_dom.loadXML (strA)
xml_dom.documentElement.setAttribute 'xmlns:dt', 'urn:schemas-microsoft-com:datatypes'
Dim l_node1
Set l_node1 = xml_dom.createElement('file1') '建立一个节点
l_node1.dataType = 'bin.base64'
ado_stream.Type = 1 ' 1=adTypeBinary
ado_stream.open
ado_stream.LoadFromFile (szFile)
l_node1.nodeTypedValue = ado_stream.Read(-1) ' -1=adReadAll
ado_stream.Close
xml_dom.documentElement.appendChild (l_node1)
xml_dom.save App.Path & '\result.xml' '本地保存一个备份
'可以创建多个二进制节点,一次上传多个文件
' 把XML文档发送到Web服务器
Dim xmlHttp As New MSXML2.XMLHTTP30
xmlHttp.open 'POST', m_szUpFile, False
xmlHttp.setRequestHeader 'CONTENT-TYPE', 'text/xml'
xmlHttp.send xml_dom
' 显示服务器返回的信息
Debug.Print xmlHttp.responseText
If xmlHttp.Status = 200 Then
MsgBox ('上传成功!')
End If
Set xmlHttp = Nothing
Set xml_dom = Nothing
End Sub
GetUpFile.asp(Server端的)
<%
Dim ado_stream
Dim oXmlDom
Dim xml_file1,m_szpath
Set oXMLDoc = Server.CreateObject('Microsoft.XMLDOM')
szPath=server.mappath('getupfile.asp')
nPos=instrRev(szPath ,'\')
m_szPath=left(szPath,nPos)
response.write szPath
oXMLDoc.load request
szNow=year(now()) & month(now()) & day(now()) & hour(now()) & minute(now()) & second(now())
szpath=m_szPath & 'upfile.xml'
oXMLDoc.save szPath
' 创建 Stream 对象
Set ado_stream = Server.CreateObject('ADODB.Stream')
' 读出包含二进制数据的节点
Set xml_file1 = oXMLDoc.selectSingleNode('/root/file1')
' 打开Stream对象,把数据存入其中
ado_stream.Type = 1 ' 1=adTypeBinary
ado_stream.open
ado_stream.Write xml_file1.nodeTypedValue
' 文件存盘
szPath=m_szpath &'images\' & szNow & '.jpg' '存储文件
ado_stream.SaveToFile szpath, 2 ' 2=adSaveCreateOverWrite
response.write szpath
ado_stream.Close
' 销毁对象
Set ado_stream = Nothing
Set xmlDoc = Nothing
%>
程序在win2000已经测试通过,不过这里有个问题不能解决,
就是xmlHttp和AdoStream都可以保存文件,但都不能建立文件夹,
就是可读写文件,但无法对目录操作。
因为我有个想法用xmlhttp替代winsock来做,
server端也写个vb程序来接受xmlHttp的东西,
哪位大大有做过或看过的,能給我指点迷津,不用客气的。
---------------------------------------------------------------
使用该方法的益处
不引起页面转换。
不需要专用组件。
可同时上传多个文件。
这段程序是纯脚本写成的,可以很容易的插入到其他代码中,而不需要任何HTML对象的配合。还可以把这个逻辑在任何支持COM标准的语言中实现。
系统安全考虑
该方法如果不用VB只用VBscript 只能使用于内部网络,因为它需要IE5的安全级别设置为“低”。必须:
允许脚本和ActiveX对象。该设置允许浏览器执行类似 'myobj = new activexobject(...)'的 JScript语句;
必须允许穿越域访问数据源。这个设置允许在客户端使用Stream对象。还必须在服务器和客户端都安装MS XML DOM 3.0 和MDAC 2.5 。