Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA内存资源不足下载大文件时出错_Vba_Winhttp_Winhttprequest - Fatal编程技术网

VBA内存资源不足下载大文件时出错

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

当我尝试使用此功能下载大文件(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_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。看来这就是问题所在。我能做什么?问题可能会发生