找回密码
 加入
搜索
查看: 6959|回复: 13

[网络通信] _WinHTTP_GetRespond获取大文件的问题

 火.. [复制链接]
发表于 2012-8-24 11:10:34 | 显示全部楼层 |阅读模式
用_WinHTTP_GetRespond函数获取内网的几M的Excel文件非常卡,只能用个Do until来一直循环,结果就是下载这个文件要花上十来分钟,但是直接用Firefox或者其他浏览器就马上就能下载下来,这是怎么回事啊?
发表于 2012-8-24 17:58:28 | 显示全部楼层
人家浏览器下载是用了多线程吧(?)
_WinHTTP_GetRespond就一个线程吧(?)
发表于 2012-8-24 18:59:48 | 显示全部楼层
_WinHTTP_GetRespond要是能规定返回信息量就好了
发表于 2012-8-24 22:35:07 | 显示全部楼层
没用过,帮顶
发表于 2012-8-25 11:51:22 | 显示全部楼层
回复 3# whitehead


示例不是有用自定义的函数接管下载的过程吗?

创建句柄后你可以自行设置该句柄的特定参数,该函数并不做相关的工作。
发表于 2012-8-25 12:21:26 | 显示全部楼层
回复 1# qinylj

不知道你是用的什么网络,这里测试没问题。

测试用的代码:
#include <WinHttp_GetRespond.au3>
        $MyOpen=_WinHttpOpen()
        Local $Request[3]=["$hRequest",@ScriptDir &"\暖色调悲伤01.flv",32]                        ;-----该参数与 _DownLoadByResPodn 的参数相对应
        $rContext=_WinHTTP_GetRespond($MyOpen,"http://192.168.11.3/G%3A/暖色调悲伤01.flv",-1,-1,-1,-1,-1,-1,"_DownLoadByResPodn",$Request)
        If Not @error Then 
                MsgBox(64,"Example 5 结果","下载完成!")
        Else
                MsgBox(48,@error,$rContext)
        EndIf
        _WinHttpCloseHandle($MyOpen) 

Func _DownLoadByResPodn($hRequest,$SaveFile,$FileBlock)
        $File=FileOpen($SaveFile,18)
        Local $TotalLength =_WinHttpQueryHeaders($hRequest,$WINHTTP_QUERY_CONTENT_LENGTH)        ;文件长度
        Local $ri = 0, $TotalTime = TimerInit(), $StepTime = TimerInit(),$Stepri = 0
        For $i = 1 To 1000000
                $rDate= _WinHttpReadData($hRequest,2,1024 * $FileBlock)
                If @error Then ExitLoop
                FileWrite($File,$rDate)
                $ri += BinaryLen($rDate)
                $Stepri += BinaryLen($rDate)
                If TimerDiff($StepTime) >= 998 Then
                        ConsoleWrite('At '& @HOUR & ':' & @MIN & ':' & @SEC & ' - 下载速度:' & $Stepri / 1024 &" KB" & ' 已完成:' & Round($ri / $TotalLength * 100,2) & '%' &@CRLF)
                        $StepTime = TimerInit()
                        $Stepri = 0
                EndIf
                Sleep(1)
        Next
        ConsoleWrite("Done .用时:" & Int(TimerDiff( $TotalTime )/1000) & ' Sec ,文件总大小:'&  $TotalLength / 1024 & 'KB' &@CRLF)
        FileClose($File)
        _WinHttpCloseHandle($hRequest)
        Return
EndFunc

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-8-25 21:36:21 | 显示全部楼层
回复 5# republican

谢谢republican大侠关注,我可能没说清。
我是指,比如无法指定读取1000字节的数据内容吧?有时工作中并不需要读取全部数据内容,读一小部分就够了。
发表于 2012-8-25 22:15:28 | 显示全部楼层
回复 7# whitehead


以6楼例子来说...你判断$ri >= 1000直接Return不就行了?....................................
发表于 2012-8-26 10:22:15 | 显示全部楼层
回复 8# republican
谢谢republican大侠,学习还是不够认真啊
 楼主| 发表于 2012-8-27 15:57:54 | 显示全部楼层
回复 6# republican


    不是直接下文件哈,是一个php页面返回的数据,返回的数据是伪Excel表。
发表于 2012-8-27 18:24:12 | 显示全部楼层
这个,期待高手解决中…,顺学习下
发表于 2012-8-29 07:27:46 | 显示全部楼层
回复 10# qinylj

下载是广义的说法,况且获取服务器返回数据就是下载的意思,没什么不一样....
 楼主| 发表于 2012-8-30 10:02:06 | 显示全部楼层
回复 12# republican


    今天仔细的排查了一下,然后又用浏览器操作了几次,确定是服务器有问题,呵呵,感谢了。
发表于 2012-8-30 12:39:24 | 显示全部楼层
呵呵,学习了。。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-15 13:27 , Processed in 0.089713 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表