VBA内存资源不足下载大文件时出错
当我尝试使用此功能下载大文件(2GB)时,出现此错误“没有足够的内存资源来完成此操作”。那么,我能做什么VBA内存资源不足下载大文件时出错,vba,winhttp,winhttprequest,Vba,Winhttp,Winhttprequest,当我尝试使用此功能下载大文件(2GB)时,出现此错误“没有足够的内存资源来完成此操作”。那么,我能做什么 Function DownloadFile(ByVal URL As String, ByVal Path As String, ByVal UserName As String, ByVal Password As String) As Boolean DownloadFile = False Const HTTPREQUEST_SETCREDENTIALS_FOR
Function DownloadFile(ByVal URL As String, ByVal Path As String, ByVal UserName As String, ByVal Password As String) As Boolean
DownloadFile = False
Const HTTPREQUEST_SETCREDENTIALS_FOR_SERVER = 0
Dim WinHttpReq As Object
Dim oStream As Object
Set WinHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")
WinHttpReq.Open "GET", URL, False
WinHttpReq.SetCredentials UserName, Password, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER
WinHttpReq.send
Set oStream = CreateObject("ADODB.Stream")
oStream.Open
oStream.Type = 1
oStream.Write WinHttpReq.responseBody
oStream.SaveToFile Path, 2
oStream.Close
DownloadFile = True
Set WinHttpReq = Nothing
Set oStream = Nothing
End Function
这是我的代码,工作正常,您可以设置块大小。如果你在逻辑上有任何改进,请告诉我
Sub Download()
Dim UserName As String
Dim Password As String
Dim Path As String
Dim url As String
Dim chunkSize As Long
UserName = ""
Password = ""
Path = ""
url = ""
chunkSize = 500000000 '500 mega
Const HTTPREQUEST_SETCREDENTIALS_FOR_SERVER = 0
Dim WinHttpReq As Object
Dim oStream As Object
Dim iStream As Object
Dim totalSize As Double
Dim currentStartByte As Double
Dim currentEndByte As Double
'get the total file size
Set WinHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")
WinHttpReq.Open "HEAD", url, False
WinHttpReq.SetCredentials UserName, Password, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER
WinHttpReq.setRequestHeader "User-Agent", 0
WinHttpReq.send
totalSize = WinHttpReq.getResponseHeader("Content-Length")
Set WinHttpReq = Nothing
Set oStream = CreateObject("ADODB.Stream")
oStream.Open
oStream.Type = 1 'adTypeBinary
'set the initial start and end byte
currentStartByte = 0
if totalSize < chunkSize then
currentEndByte = totalSize
else
currentEndByte = chunkSize
end if
Dim firstloop As Boolean
firstloop = True
Do While (currentEndByte > currentStartByte)
Set iStream = CreateObject("ADODB.Stream")
iStream.Open
iStream.Type = 1 'adTypeBinary
'read the data from the saved file to out stream
If firstloop = False Then
iStream.LoadFromFile Path
oStream.Write iStream.Read
End If
'read the chunked data from the responseBody to out stream
Set WinHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")
WinHttpReq.Open "GET", url, False
WinHttpReq.SetCredentials UserName, Password, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER
WinHttpReq.setRequestHeader "User-Agent", 0
WinHttpReq.setRequestHeader "Range", "bytes=" + Str(currentStartByte) + "-" + Str(currentEndByte)
WinHttpReq.send
oStream.Write WinHttpReq.responseBody
'save out stream to the file
oStream.SaveToFile Path, IIf(1, 2, 1)
'set the start and end byte for the next loop
currentStartByte = currentStartByte + chunkSize + 1
currentEndByte = currentEndByte + chunkSize + 1
'if the remaining byte less than chunk size
If currentEndByte > totalSize Then
currentEndByte = totalSize
End If
firstloop = False
Set WinHttpReq = Nothing
iStream.Close
Set iStream = Nothing
Loop
oStream.Close
Set oStream = Nothing
End Sub
Sub下载()
将用户名设置为字符串
将密码设置为字符串
将路径设置为字符串
将url设置为字符串
大小与长度相同
UserName=“”
Password=“”
Path=“”
url=“”
chunkSize=500000000'500百万
服务器=0的常量HTTPREQUEST\u SETCREDENTIALS\u
Dim WinHttpReq作为对象
作为对象的暗淡光束
作为对象的模糊iStream
总尺寸为双倍
暗电流起始字节为双字节
Dim currentEndByte为双精度
'获取总文件大小
设置WinHttpRequest=CreateObject(“WinHttp.WinHttpRequest.5.1”)
WinHttpReq.Open“HEAD”,url,False
WinHttpRequest.SetCredentials用户名、密码、HTTPREQUEST\u SetCredentials\u用于\u服务器
WinHttpReq.setRequestHeader“用户代理”,0
WinHttpReq.send
totalSize=WinHttpReq.getResponseHeader(“内容长度”)
设置WinHttpReq=Nothing
设置oStream=CreateObject(“ADODB.Stream”)
奥斯特雷姆,开门
oStream.Type=1'adTypeBinary
'设置初始开始和结束字节
currentStartByte=0
如果totalSizecurrentStartByte)
设置iStream=CreateObject(“ADODB.Stream”)
iStream,打开
iStream.Type=1'adTypeBinary
'将保存文件中的数据读取到输出流
如果firstloop=False,则
iStream.LoadFromFile路径
oStream.Write-iStream.Read
如果结束
'从responseBody读取分块数据以输出数据流
设置WinHttpRequest=CreateObject(“WinHttp.WinHttpRequest.5.1”)
WinHttpReq.Open“GET”,url,False
WinHttpRequest.SetCredentials用户名、密码、HTTPREQUEST\u SetCredentials\u用于\u服务器
WinHttpReq.setRequestHeader“用户代理”,0
WinHttpReq.setRequestHeader“范围”、“字节数=“+Str(currentStartByte)+”-“+Str(currentEndByte)
WinHttpReq.send
oStream.Write WinHttpReq.responseBody
'将输出流保存到文件
oStream.SaveToFile路径,IIf(1,2,1)
'设置下一个循环的开始和结束字节
currentStartByte=currentStartByte+chunkSize+1
currentEndByte=currentEndByte+chunkSize+1
'如果剩余字节小于块大小
如果currentEndByte>totalSize,则
currentEndByte=总大小
如果结束
firstloop=False
设置WinHttpReq=Nothing
iStream.关闭
设置iStream=Nothing
环
奥斯特雷姆,完毕
设置oStream=Nothing
端接头
这是我的代码,工作正常,您可以设置块大小。如果你在逻辑上有任何改进,请告诉我
Sub Download()
Dim UserName As String
Dim Password As String
Dim Path As String
Dim url As String
Dim chunkSize As Long
UserName = ""
Password = ""
Path = ""
url = ""
chunkSize = 500000000 '500 mega
Const HTTPREQUEST_SETCREDENTIALS_FOR_SERVER = 0
Dim WinHttpReq As Object
Dim oStream As Object
Dim iStream As Object
Dim totalSize As Double
Dim currentStartByte As Double
Dim currentEndByte As Double
'get the total file size
Set WinHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")
WinHttpReq.Open "HEAD", url, False
WinHttpReq.SetCredentials UserName, Password, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER
WinHttpReq.setRequestHeader "User-Agent", 0
WinHttpReq.send
totalSize = WinHttpReq.getResponseHeader("Content-Length")
Set WinHttpReq = Nothing
Set oStream = CreateObject("ADODB.Stream")
oStream.Open
oStream.Type = 1 'adTypeBinary
'set the initial start and end byte
currentStartByte = 0
if totalSize < chunkSize then
currentEndByte = totalSize
else
currentEndByte = chunkSize
end if
Dim firstloop As Boolean
firstloop = True
Do While (currentEndByte > currentStartByte)
Set iStream = CreateObject("ADODB.Stream")
iStream.Open
iStream.Type = 1 'adTypeBinary
'read the data from the saved file to out stream
If firstloop = False Then
iStream.LoadFromFile Path
oStream.Write iStream.Read
End If
'read the chunked data from the responseBody to out stream
Set WinHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1")
WinHttpReq.Open "GET", url, False
WinHttpReq.SetCredentials UserName, Password, HTTPREQUEST_SETCREDENTIALS_FOR_SERVER
WinHttpReq.setRequestHeader "User-Agent", 0
WinHttpReq.setRequestHeader "Range", "bytes=" + Str(currentStartByte) + "-" + Str(currentEndByte)
WinHttpReq.send
oStream.Write WinHttpReq.responseBody
'save out stream to the file
oStream.SaveToFile Path, IIf(1, 2, 1)
'set the start and end byte for the next loop
currentStartByte = currentStartByte + chunkSize + 1
currentEndByte = currentEndByte + chunkSize + 1
'if the remaining byte less than chunk size
If currentEndByte > totalSize Then
currentEndByte = totalSize
End If
firstloop = False
Set WinHttpReq = Nothing
iStream.Close
Set iStream = Nothing
Loop
oStream.Close
Set oStream = Nothing
End Sub
Sub下载()
将用户名设置为字符串
将密码设置为字符串
将路径设置为字符串
将url设置为字符串
大小与长度相同
UserName=“”
Password=“”
Path=“”
url=“”
chunkSize=500000000'500百万
服务器=0的常量HTTPREQUEST\u SETCREDENTIALS\u
Dim WinHttpReq作为对象
作为对象的暗淡光束
作为对象的模糊iStream
总尺寸为双倍
暗电流起始字节为双字节
Dim currentEndByte为双精度
'获取总文件大小
设置WinHttpRequest=CreateObject(“WinHttp.WinHttpRequest.5.1”)
WinHttpReq.Open“HEAD”,url,False
WinHttpRequest.SetCredentials用户名、密码、HTTPREQUEST\u SetCredentials\u用于\u服务器
WinHttpReq.setRequestHeader“用户代理”,0
WinHttpReq.send
totalSize=WinHttpReq.getResponseHeader(“内容长度”)
设置WinHttpReq=Nothing
设置oStream=CreateObject(“ADODB.Stream”)
奥斯特雷姆,开门
oStream.Type=1'adTypeBinary
'设置初始开始和结束字节
currentStartByte=0
如果totalSizecurrentStartByte)
设置iStream=CreateObject(“ADODB.Stream”)
iStream,打开
iStream.Type=1'adTypeBinary
'将保存文件中的数据读取到输出流
如果firstloop=False,则
iStream.LoadFromFile路径
oStream.Write-iStream.Read
如果结束
'从responseBody读取分块数据以输出数据流
设置WinHttpRequest=CreateObject(“WinHttp.WinHttpRequest.5.1”)
WinHttpReq.Open“GET”,url,False
WinHttpRequest.SetCredentials用户名、密码、HTTPREQUEST\u SetCredentials\u用于\u服务器
WinHttpReq.setRequestHeader“用户代理”,0
WinHttpReq.setRequestHeader“范围”、“字节数=“+Str(currentStartByte)+”-“+Str(currentEndByte)
WinHttpReq.send
oStream.Write WinHttpReq.responseBody
'将输出流保存到文件
oStream.SaveToFile路径,IIf(1,2,1)
'设置下一个循环的开始和结束字节
currentStartByte=currentStartByte+chunkSize+1
currentEndByte=currentEndByte+chunkSize+1
'如果剩余字节小于块大小
如果currentEndByte>totalSize,则
currentEndByte=总大小
如果结束
firstloop=False
设置WinHttpReq=Nothing
iStream.关闭
设置iStream=Nothing
环
奥斯特雷姆,完毕
设置oStream=Nothing
端接头
您的目录中是否有2GB的可用空间路径
?@Teamothy是的,我有此代码运行时加载了多少RAM?@FaneDuru是的,正在使用的RAM是6GB,可用的是1.9GB。看来这就是问题所在。我能做什么?问题可能是ADODB。使用其他东西,例如文件系统对象。您的目录路径中是否有2GB的可用空间?@Teamothy是的,我有此代码运行时加载了多少RAM?@FaneDuru是的,正在使用的RAM为6 GB,可用空间为1.9GB。看来这就是问题所在。我能做什么?问题可能会发生