VB XMLHTTP 想用传送普通文本的方法传送文件,请高手支招

aamiiLA 2008-10-05 03:16:03
远程66_2.asp为一个可用浏览器上传文件的程序。如何传送文件的数据?
传送的文件要求不大。

Private Sub Command4_Click()
strHTML = GetBody(webuseall & "66_2.asp?id=123&sj=???&TS=" & Now, "gb2312")'如何在这里传送文件的数据?
End Sub


Public Function GetBody(Url, CodeBase) '第一个参数是设置编码方式(GB2312或UTF-8)第二个参数是地址.
Dim xmlHTTP1
Set xmlHTTP1 = CreateObject("Microsoft.XMLHTTP")
xmlHTTP1.Open "get", Url, False
xmlHTTP1.send
While xmlHTTP1.ReadyState <> 4
DoEvents
Wend
GetBody = xmlHTTP1.ResponseBody
If CStr(GetBody) <> "" Then GetBody = BytesToBstr(GetBody, CodeBase)
Set ObjXML = Nothing
End Function

Public Function BytesToBstr(strBody, CodeBase)
Dim ObjStream
Set ObjStream = CreateObject("Adodb.Stream")
With ObjStream
.Type = 1
.Mode = 3
.Open
.Write strBody
.Position = 0
.Type = 2
.Charset = CodeBase
BytesToBstr = .ReadText
.Close
End With
Set ObjStream = Nothing
End Function
...全文
880 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
feiyun0112 2008-10-08
  • 打赏
  • 举报
回复
像2楼那样做,但是具体的数据可能会不同,你可以用sniffer截获IE的数据看看

*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)
http://feiyun0112.cnblogs.com/
online 2008-10-08
  • 打赏
  • 举报
回复
简单一些的办法是把文件base64编码成字符串,然后post提交,会简化很多
请看我的博客上的
http://blog.csdn.net/online/archive/2004/07/07/35994.aspx
现在还是人类 2008-10-08
  • 打赏
  • 举报
回复
其实问题倒是很简单,只不过你没有这方面的基础就有点难解释而已。
aamiiLA 2008-10-08
  • 打赏
  • 举报
回复
我想快点搞定这个。应该是个不容易的问题。
现在还是人类 2008-10-08
  • 打赏
  • 举报
回复
那你要重头慢慢学了,呵呵
aamiiLA 2008-10-07
  • 打赏
  • 举报
回复
可不可以进一步说明白些呢?这方面比较缺陷。
现在还是人类 2008-10-06
  • 打赏
  • 举报
回复
我给你的只是范例代码,你要看看原理。
如果你不懂如何向HTTP头天家内容,我举了个例子教你如何添加
但并不表示那个例子就代表所有的内容

POST /bb.asp HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Content-Type: multipart/form-data; boundary=---------------------------7d82711db0bfc
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: www.xxx.com
Content-Length: 53
Connection: Keep-Alive
Cache-Control: no-cache

这些都是头文件里有的东西,除了POST /bb.asp HTTP/1.1不是setRequestHeader方法所能控制
其他的都可以用setRequestHeader来设置或添加,别人告诉你东西你就仔细看,用脑想,
因为我告诉你的不单是程序方法,还有原理,这样你就可以看看原理和程序上有什么不同的地方,
以原理为基础写程序。因为程序是跟着原理走的。
aamiiLA 2008-10-06
  • 打赏
  • 举报
回复
上传无反应。还请高手再教:


Private Sub Command4_Click()
Command3.Enabled = False
Url = webuseall & "66_2.asp?id=" & iii & "&myip=" & ff & "&uid=" & qjuserid & "&TS=" & Now
GetBody2 (Url)
End Sub


Public Function GetBody2(Url) '发送文件的XMLHTTP方法设置
Dim xmlHTTP2
SentInfo = ""
SentInfo = SentInfo & "-----------------------------7d82711db0bfc" & vbCrLf
SentInfo = SentInfo & "Content-Disposition: form-data; name=" & Chr(34) & "UpFile" & Chr(34) & "; filename=" & Text5.Text & "" & vbCrLf
SentInfo = SentInfo & "Content-Type: text/plain" & vbCrLf
SentInfo = SentInfo & "" & vbCrLf
SentInfo = SentInfo & "这时a.txt的文件内容,因为是文本,所以字节内容也能看见" & vbCrLf
SentInfo = SentInfo & "-----------------------------7d82711db0bfc--" & vbCrLf

Set xmlHTTP2 = CreateObject("Microsoft.XMLHTTP") '你这里是创建XMLHTTP对象
xmlHTTP2.Open "POST", Url, False '这里是指定用POST方法提交请求
xmlHTTP2.setRequestHeader "Content-Type", "multipart/form-data; boundary=---------------------------7d82711db0bfc" '这里设置HTTP头中 Content-Type 的内容

xmlHTTP2.Send StrConv(SentInfo, vbFromUnicode) '将文本转换为字节数组来发送
MsgBox StrConv(SentInfo, vbFromUnicode)
End Function


66_2.asp
<!--#include FILE="upload_5xsoft.asp"-->

<%tid=request("id")%>
<%

Response.Buffer = true
Response.Expires = -1
dats=tid
set upload=new upload_5xsoft ''建立上传对象
formPath="loads_file/" ''上传目录
if formPath="" then
HtmEnd "上传目录错误!"
set upload=nothing
response.end
if right(formPath,1)<>"/" then formPath=formPath&"/"
end if
。。。。。。
aamiiLA 2008-10-06
  • 打赏
  • 举报
回复
我思路不清。
现在还是人类 2008-10-05
  • 打赏
  • 举报
回复
你再不懂估计没什么人能马上教会你了,给你用还差不多,呵呵
现在还是人类 2008-10-05
  • 打赏
  • 举报
回复
Set xmlHTTP1 = CreateObject("Microsoft.XMLHTTP") '你这里是创建XMLHTTP对象
xmlHTTP1.Open "get", Url, False '这里是指定用GET方法提交请求
xmlHTTP1.send '这里是开始发送请求以及相关数据,不过你没有发送

大致方法可以这样


'设置要发送的内容
SentInfo=""
SentInfo = SentInfo & "-----------------------------7d82711db0bfc" & vbCrLf
SentInfo = SentInfo & "Content-Disposition: form-data; name=" & Chr(34) & "UpFile" & Chr(34) & "; filename=" & Chr(34) & "C:\a.txt" & Chr(34) & "" & vbCrLf
SentInfo = SentInfo & "Content-Type: text/plain" & vbCrLf
SentInfo = SentInfo & "" & vbCrLf
SentInfo = SentInfo & "这时a.txt的文件内容,因为是文本,所以字节内容也能看见" & vbCrLf
SentInfo = SentInfo & "-----------------------------7d82711db0bfc--" & vbCrLf

Set xmlHTTP1 = CreateObject("Microsoft.XMLHTTP") '你这里是创建XMLHTTP对象
xmlHTTP1.Open "POST", Url, False '这里是指定用POST方法提交请求
xmlHTTP1.setRequestHeader "Content-Type", "multipart/form-data; boundary=---------------------------7d82711db0bfc" '这里设置HTTP头中 Content-Type 的内容

xmlHTTP1.Send StrConv(SentInfo,vbFromUnicode) '将文本转换为字节数组来发送

当然,你的文件不一定是文本文件,可能是图片或其他什么的,但只要将文件数据套进发送格式中就没问题了
还有就是要注意设置一下HTTP头的Content-Length属性值,表示发送的数据字节总数,不用包含HTTP头内容的字节数
aamiiLA 2008-10-05
  • 打赏
  • 举报
回复
哎还是不懂应该怎么发送。
现在还是人类 2008-10-05
  • 打赏
  • 举报
回复
不知道你清不清楚HTTP协议,但大概的还是和你说一下
通常IE浏览器浏览某个网页的时候,是主动的通过TCP/IP协议连接远程服务器的80端口
服务器收到连接请求后会与浏览器进行连接
当IE浏览器确认连接请求成功后,会向服务器发出 HTTP协议的提交信息,然后服务器根据
这个提交信息进行处理,然后返回相应的信息给IE浏览器,然后断开连接。

而如果想用VB上传文件给某个服务器脚本程序处理,就要模拟IE浏览器提交数据的过程。
我所说的就是IE浏览器服务器发出 HTTP协议的提交信息 的大概过程。
HTTP协议中比较重要的大概有两个部分

一个是 IE浏览器提交的信息部分,还有一部分就是服务器返回给IE浏览器信息的部分。
因为你的想法是达到上传文件的效果,所以我就主要讲一下IE浏览器提交信息这部分。
而这部分也可以分为两块来看:
1、HTTP头信息,这里主要是告诉服务器你到底要干什么,并且提供相关的信息给服务器进行处理
2、提交的参数或数据部分,通常是供服务器脚本程序所用的。

我举个例子,如果你想看某个网页,可以连接服务器后提交这样的信息

GET /bb.asp?ID=123 HTTP/1.1
Accept: */*
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: www.e4j.cn
Connection: Keep-Alive
Cookie: MMEC%3A1313Hhop98jp%2FYt=2006%2D12%2D26+23%3A57%3A26v9QDvgcrx1IWikjM4oeU; ASPSESSIONIDAQDBSCRQ=BLMHBCPAPJJMOKEAKLECJIBI

因为使用 GET 作为头,所以这个信息中就没有第二部分,只有所谓的HTTP头部分,但也可以这样做

POST /bb.asp HTTP/1.1
Accept: */*
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: www.e4j.cn
Connection: Keep-Alive
Cookie: MMEC%3A1313Hhop98jp%2FYt=2006%2D12%2D26+23%3A57%3A26v9QDvgcrx1IWikjM4oeU; ASPSESSIONIDAQDBSCRQ=BLMHBCPAPJJMOKEAKLECJIBI

ID=123

用POST的方法可以将要提交的数据放在HTTP头之后

其实上传文件也是一样的,比如要上传一个文件给 bb.asp 进行处理,IE浏览器会这么发送信息

POST /bb.asp HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Content-Type: multipart/form-data; boundary=---------------------------7d82711db0bfc
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: www.xxx.com
Content-Length: 53
Connection: Keep-Alive
Cache-Control: no-cache

-----------------------------7d82711db0bfc
Content-Disposition: form-data; name="UpFile"; filename="C:\a.txt"
Content-Type: text/plain

这时a.txt的文件内容,因为是文本,所以字节内容也能看见
-----------------------------7d82711db0bfc--


其实用XMLHTTP也就是模拟的这个过程,他只是把这些信息分成属性让你设置,然后他再重组成HTTP头发出去而已
而以下内容则是要提交的内容,格式我说得很清楚了,发送方法就是把这些内容放到一个字节数组中发送
-----------------------------7d82711db0bfc
Content-Disposition: form-data; name="UpFile"; filename="C:\a.txt"
Content-Type: text/plain

这时a.txt的文件内容,因为是文本,所以字节内容也能看见
-----------------------------7d82711db0bfc--

要注意的是HTTP头中的boundary=---------------------------7d82711db0bfc
这里说明了文件分割标志,而且这个标志不能与文件内容有重复,不然解码程序会出错
aamiiLA 2008-10-05
  • 打赏
  • 举报
回复
请高手指教:下面程序应放在哪?

Content-Disposition: form-data; '这个不清楚,照样抄就可以了
name="UpFile"; '这个就是如 <Input Type='File' Name="UpFile"> 标签的名称
filename="C:\jdphpb.rar" '这个是你客户端上传文件的本地地址
Content-Type: application/octet-stream '表示你的数据是二进制数据


另外:

不过HTTP头好像也要说明一下,主要是说明 enctype='multipart/form-data' 问题,其他就没什么了

这放在哪?
现在还是人类 2008-10-05
  • 打赏
  • 举报
回复
vb就是模拟网页提交呀,我只是解释给你听网页这么放,实际提交的是什么数据而已
aamiiLA 2008-10-05
  • 打赏
  • 举报
回复
我上面的代码是VB的呢。
aamiiLA 2008-10-05
  • 打赏
  • 举报
回复
<Input Type='File' Name="UpFile">
好像是网页的?
aamiiLA 2008-10-05
  • 打赏
  • 举报
回复
请高手指教:下面程序应放在哪?

Content-Disposition: form-data; '这个不清楚,照样抄就可以了
name="UpFile"; '这个就是如 <Input Type='File' Name="UpFile"> 标签的名称
filename="C:\jdphpb.rar" '这个是你客户端上传文件的本地地址
Content-Type: application/octet-stream '表示你的数据是二进制数据



另外:

不过HTTP头好像也要说明一下,主要是说明 enctype='multipart/form-data' 问题,其他就没什么了

这放在哪?
现在还是人类 2008-10-05
  • 打赏
  • 举报
回复
xmlHTTP1.send 你的数据

不过如果是文件,需要相应的格式设置
好久没研究了,忘了格式是什么样的了,但大概是这样

-----------------------------7d835b6f0c38
Content-Disposition: form-data; name="UpFile"; filename="C:\jdphpb.rar"
Content-Type: application/octet-stream

这里是具体数据
-----------------------------7d835b6f0c38--



下面来分析一下
-----------------------------7d835b6f0c38 '这个作为分段的标志,反正在你上传的文件数据中没有与此相同的就可以
Content-Disposition: form-data; '这个不清楚,照样抄就可以了
name="UpFile"; '这个就是如 <Input Type='File' Name="UpFile"> 标签的名称
filename="C:\jdphpb.rar" '这个是你客户端上传文件的本地地址
Content-Type: application/octet-stream '表示你的数据是二进制数据

这里是具体数据 '这里就用VB读一个文件的字节数组放进去就可以了
-----------------------------7d835b6f0c38-- '这里表示文件数据结束

如果有多个文件,也是按这种格式放,如

-----------------------------7d835b6f0c38
Content-Disposition: form-data; name="UpFile1"; filename="C:\1.txt"
Content-Type: application/octet-stream

这是文本1的内容
-----------------------------7d835b6f0c38--
-----------------------------7d835b6f0c38
Content-Disposition: form-data; name="UpFile2"; filename="C:\2.txt"
Content-Type: application/octet-stream

这是文本2的内容
-----------------------------7d835b6f0c38--
...
-----------------------------7d835b6f0c38
Content-Disposition: form-data; name="UpFile"; filename="C:\n.txt"
Content-Type: application/octet-stream

这是文本n的内容
-----------------------------7d835b6f0c38--


只要把这些数据放到一个字节数组中,然后通过 XMLHTTP 的 send 方法一起提交出去就可以了
不过HTTP头好像也要说明一下,主要是说明 enctype='multipart/form-data' 问题,其他就没什么了
aamiiLA 2008-10-05
  • 打赏
  • 举报
回复
这里要实现的是用VB结合ASP传送小文件。

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧