qinylj 发表于 2012-8-24 11:10:34

_WinHTTP_GetRespond获取大文件的问题

用_WinHTTP_GetRespond函数获取内网的几M的Excel文件非常卡,只能用个Do until来一直循环,结果就是下载这个文件要花上十来分钟,但是直接用Firefox或者其他浏览器就马上就能下载下来,这是怎么回事啊?

ajian55 发表于 2012-8-24 17:58:28

人家浏览器下载是用了多线程吧(?)
_WinHTTP_GetRespond就一个线程吧(?)

whitehead 发表于 2012-8-24 18:59:48

_WinHTTP_GetRespond要是能规定返回信息量就好了

lxwlxwayy 发表于 2012-8-24 22:35:07

没用过,帮顶

republican 发表于 2012-8-25 11:51:22

回复 3# whitehead


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

创建句柄后你可以自行设置该句柄的特定参数,该函数并不做相关的工作。

republican 发表于 2012-8-25 12:21:26

回复 1# qinylj

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

测试用的代码:
#include <WinHttp_GetRespond.au3>
        $MyOpen=_WinHttpOpen()
        Local $Request=["$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

whitehead 发表于 2012-8-25 21:36:21

回复 5# republican

谢谢republican大侠关注,我可能没说清。
我是指,比如无法指定读取1000字节的数据内容吧?有时工作中并不需要读取全部数据内容,读一小部分就够了。

republican 发表于 2012-8-25 22:15:28

回复 7# whitehead


以6楼例子来说...你判断$ri >= 1000直接Return不就行了?....................................

whitehead 发表于 2012-8-26 10:22:15

回复 8# republican
谢谢republican大侠,学习还是不够认真啊

qinylj 发表于 2012-8-27 15:57:54

回复 6# republican


    不是直接下文件哈,是一个php页面返回的数据,返回的数据是伪Excel表。

凌菡 发表于 2012-8-27 18:24:12

这个,期待高手解决中…,顺学习下

republican 发表于 2012-8-29 07:27:46

回复 10# qinylj

下载是广义的说法,况且获取服务器返回数据就是下载的意思,没什么不一样....

qinylj 发表于 2012-8-30 10:02:06

回复 12# republican


    今天仔细的排查了一下,然后又用浏览器操作了几次,确定是服务器有问题,呵呵,感谢了。

andersonljw 发表于 2012-8-30 12:39:24

呵呵,学习了。。。
页: [1]
查看完整版本: _WinHTTP_GetRespond获取大文件的问题