利用HttpSendRequestAPI函数上载二进制大文件

上传人:飞*** 文档编号:32710859 上传时间:2018-02-12 格式:DOC 页数:5 大小:165.71KB
返回 下载 相关 举报
利用HttpSendRequestAPI函数上载二进制大文件_第1页
第1页 / 共5页
利用HttpSendRequestAPI函数上载二进制大文件_第2页
第2页 / 共5页
利用HttpSendRequestAPI函数上载二进制大文件_第3页
第3页 / 共5页
利用HttpSendRequestAPI函数上载二进制大文件_第4页
第4页 / 共5页
利用HttpSendRequestAPI函数上载二进制大文件_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《利用HttpSendRequestAPI函数上载二进制大文件》由会员分享,可在线阅读,更多相关《利用HttpSendRequestAPI函数上载二进制大文件(5页珍藏版)》请在金锄头文库上搜索。

1、张嘉惠,崔超艳(陕西微生物研究所,西安 710043)摘 要 : 通 过 微 生 物 菌 种 资 源 数 据 库 编 程 实 例 ,详 细 解 读 了 上 传 二 进 制 数 时 自 动 进 行 的 编 码 转 换 和 数 据 溢 出 的 问题,并提出了有效的解决办法。关键词: HttpSendRequest; API; 函数 ; 上 载 ; 二进制大文件The Datailed Interpretation of Uploading Large Binary Documents withHttpSendRequest APIZHANG Jiahui , CUI Chaoyan(Shanxi

2、Microbiology Institute , Xian 710043)Abstract:According to the programming e xample of Strain Database ,We have interpreted the automatic code conversionand date overflew in updoading large binary documents ,and have gotten the effective solution.Key words:HttpSendRequest ; API ; function ; upload ;

3、 large binary documents近 年 来 ,随 着 多 媒 体 数 据 库 的 引 入 ,对 数 据 的 管 理 方 法又 开 始 酝 酿 新 的 变 革 ,微 生 物 菌 种 资 源 数 据 库 也 运 用 了 多 媒 体 数 据 库 技 术 。当 图 像 、声 音 、动 态 视 频 等 多 媒 体 信 息 引 入计 算 机 之 后 ,可 以 表 达 的 信 息 范 围 大 大 扩 展 ,但 又 带 来 许 多新 的 问 题 ,如 本 文 要 解 决 的 数 据 上 传 问 题 。通 常 将 声 音 、动 态 视 频 等 大 文 件 用 http 方 式 上 载 到 IIS

4、服 务 器 上 需 要 用 到 HttpSendRequest API 函 数 , 但 由 于 程 序 员 在 使 用 HttpSendRequest API 函 数 时 对 其 理 解 不 够 透 彻 ,从 而 导 致 文 件 上 载 过 慢 甚 至 失 败 。通 过 详 细 阐 述 HttpSendRequest API 函 数 上 载 二 进 制 大 文 件 时 应 注 意 的 问 题 及 其 解 决 办 法 使 程 序 员在 编 程 过 程 中 能 正 确 的 编 写 代 码 ,达 到 预 期 效 果 ,开 发 出 更灵活、更实用、更具效率的应用程序。1 一般情况一 般 情 况 下 ,

5、HttpSendRequest API 函 数 可 以 上 传 字 符 的字 节 数 据 到 服 务 器 端 的 缓 冲 区 ,再 由 服 务 器 端 程 序 的 接 收 程序从缓冲区取出数据来使用。将 API 函 数 在 模 块 级 中 定 义 (仅 定 义 HttpSendRequest 函 数,其它用到的 API 函数读者可参照定义 ):- 向 HTTP 服务器发送指定的请求和数据-LoadPostData= FalsehInternetSession = 0 hInternetConnect = 0 hHttpOpenRequest = 0srv = Mid (sUrl, 8, InS

6、tr (8, sUrl, /) - 8) 取 sUrl 参数中的 IP 地址或域名部分script = Mid (sUrl, InStr (8, sUrl, /) 取 sUrl 参数中的虚 拟目录和文档部分port = 80 端口hInternetSession = InternetOpen (App.EXEName, _ INTERNET_OPEN_TYPE_PRECONFIG, vbNullString,vbNullString, 0)If hInternetSession 0 ThenhInternetConnect = InternetConnect (hInternetSession

7、, _srv $ , port $ , vbNullString, HTTP/1.1 ,INTERNET_SERVICE_HTTP, 0, 0)If hInternetConnect 0 ThenhHttpOpenRequest = HttpOpenRequest ( hInternetConnect, _ POST ,script$, HTTP/1.1 ,vbNullString,0, _ INTERNET_FLAG_NO_CACHE_WRITE, 0)If hHttpOpenRequest 0 ThensHeader = Content -Type:www -code -urlencode

8、d& vbCrLfbRet = HttpAddRequestHeaders ( hHttpOpenRequest, sHeader, _Len (sHeader) , HTTP_ADDREQ_FLAG_REPLACE _ Or HTTP_ADDREQ_FLAG_ADD)lpszPostData = poststr$ & &FileStart= & postdata lPostDataLen = LenB (StrConv (lpszPostData, vbFromUnicode)bRet = HttpSendRequest (hHttpOpenRequest, vbNullString, _P

9、rivate Declare Function HttpSendRequestdll Alias HttpSendRequestA _Lib wininet.(ByVal hHttpOpenRequest As Long, ByVal sHeadersAs String, _ByVal lHeadersLength As Long, ByVal sOptional AsString, _ByVal lOptionalLength As Long) As LongPublic Function LoadPostData ( sUrl As String, poststr AsString,pos

10、tdata As Variant) As BooleanOn Error GoTo ErrEndLoadPostData函数进行别名重定义如下:- 向 HTTP 服务器 发送指定的请求 (送二进制文件数据)-Private Declare Function HttpSendRequestByte Lib wininet.dll _Alias HttpSendRequestA (ByVal hHttpOpenRequest As Long, _ByVal sHeaders As String, ByVal lHeadersLength AsLong, _IpsOptional As Any, B

11、yVal lOptionalLength As Long) As Long不知道 读 者注意没有,上述代 码 中的 HttpSendRequestByteAPI 函 数 的 声 明 已 经 改 变 了 。第 4 个 参 数 的 声 明 由 一 个 String字 符 串 变 成 了 一 个 Any 的 参 数 ,这 样 就 可 以 给 第 4 个 参 数Byte 数组了。 所以准备上传数据的程序编码也要变化。 将 LoadPostData 函数中的下列两句:lpszPostData = poststr$ & &FileStart= & postdata lPostDataLen = LenB

12、( StrConv ( lpszPostData, vbFromUnicode)改为:lpszPostData = poststr$ & &FileStart= ReDim VbData (0) As ByteVbData = lpszPostDataReDim VbsStrB (0) As ByteVbsStrB = postdatalPostDataLen = UBound (VbData)ReDim Preserve VbData ( lPostDataLen + LenB ( postdata) As ByteFor Vm_i = lPostDataLen + 1 To lPostDa

13、taLen + LenB (postdata)If Vm_i Mod 500 = 1 ThenDoEvents: DoEventsEnd IfVbData ( Vm_i) = VbsStrB ( Vm_i - LenB ( lpszPostData) NextlPostDataLen = UBound (VbData) + 1其中:If Vm_i Mod 500 = 1 ThenDoEvents: DoEventsEnd If只 是 为 了 表 单 做 温 度 计 时 控 制 温 度 计 的 运 行 速 度 和 上 载 无关,可以不去理会。而 HttpSendRequest API 语句的调用

14、改 为:bRet = HttpSendRequest (hHttpOpenRequest, vbNullString,_0, VbData (0) , lPostDataLen)经 过 这 样 的 改 进 即 可 达 到 上 传 二 进 制 的 目 的 。服 务 器 端 的 接 收 程 序 也 无 需 用 StrConv ( Vs_DataBuffer, vbUnicode) 转 换。这样我们就解决了第一个 问题 。2.2 postdat 的字节数不能大于 50MB上 传 大 文 件 时 由 于 数 组 的 大 小 是 长 整 型 。传 送 、接 收 都bRet = InternetClose

15、Handle (hHttpOpenRequest)End IfbRet = InternetCloseHandle (hInternetConnect) End IfbRet = InternetCloseHandle (hInternetSession) End IfLoadPostData=TrueExit Function ErrEndLoadPostData: LoadPostData= False End Function以上代码解释如下:(1) 通 过 InternetOpen、 InternetConnect、 HttpOpenRequest、 HttpAddRequestHeaders API 函 数 和 IIS 服 务 器 建 立 连 接,具体体现在 sUrl 参数上。通 过 ASP 文档调用 dll 自 编 程 序库 实 现 和 服 务 器 连 接 ,服 务 器 接 收 数 据 的 程 序 就 是 放 在 自 编 的 dll 程序库中。(2) 用 HttpSendRequest API 函 数 上 传 数 据 : lpszPostData表 示

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号