Using msxml2.xmlhttp to automate downloads

J

jwwarrenva

All,

I have been trying to use the following function based on
msxml2.xmlhttp "get" to automate file downloads from web pages. I
didn't write the code, I copied it from a web page somewhere (sorry, I
don't remember where). The problem is, it doesn't work for large
files. If I attempt to download a largish file, say 5 MB, I only get
about 135 KB.

Any suggestions?

My environment: Microsoft Windows XP Professional 5.1.2600 SP 2,
Excel 2003 SP 2, Internet Explorer 6.0 SP 2.

----- code follows -----

Function SaveWebFile(ByVal vWebFile As String, ByVal vLocalFile As
String) As Boolean
Dim oXMLHTTP As Object, i As Long, vFF As Long, oResp() As Byte

Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP")
oXMLHTTP.Open "GET", vWebFile, False 'Open socket to get the
website
oXMLHTTP.Send 'send request

'Wait for request to finish
Do While oXMLHTTP.readyState <> 4
DoEvents
Loop

oResp = oXMLHTTP.responseBody 'Returns the results as a byte array

'Create local file and save results to it
vFF = FreeFile
If Dir(vLocalFile) <> "" Then Kill vLocalFile
Open vLocalFile For Binary As #vFF
Put #vFF, , oResp
Close #vFF

'Clear memory
Set oXMLHTTP = Nothing
End Function

----- end code -----

Thanks in advance,
John Warren
 
R

Randy Harmelink

Hmmm. For one thing, the XMLHTTP method is asynchronous when using
"False" as the third parameter, so there should be no reason to check
the ReadyState value. For example, here's a version of a subroutine I
use:

Public Function GetURLData(pURL As String) As String
On Error GoTo ErrorExit
Dim oHTTP As New XMLHTTP
oHTTP.Open "GET", pURL, False
oHTTP.Send
If oHTTP.Status = "200" Then GetURLData = oHTTP.responseText Else
GoTo ErrorExit
Exit Function
ErrorExit:
GetURLData = "Error"
End Function

I just tried it on a file that is larger than 135KB and had no problem
-- I got the full 279KB. Have you checked the length of the returned
data, or are you just getting 135KB in the output file? That is, are
you sure it's XMLHTTP that is the problem?
 
J

jwwarrenva

Hmmm. For one thing, the XMLHTTP method is asynchronous when using
"False" as the third parameter, so there should be no reason to check
the ReadyState value. For example, here's a version of a subroutine I
use:

Public Function GetURLData(pURL As String) As String
On Error GoTo ErrorExit
Dim oHTTP As New XMLHTTP
oHTTP.Open "GET", pURL, False
oHTTP.Send
If oHTTP.Status = "200" Then GetURLData = oHTTP.responseText Else
GoTo ErrorExit
Exit Function
ErrorExit:
GetURLData = "Error"
End Function

I just tried it on a file that is larger than 135KB and had no problem
-- I got the full 279KB. Have you checked the length of the returned
data, or are you just getting 135KB in the output file? That is, are
you sure it's XMLHTTP that is the problem?
Randy,

Thanks, I tried your function on a longish file and it seems to work.
I'm at home now and need to be at work to run a better test, but I'll
try it and let you know how things work out. I'll also check the
length of the string returned by the original version.

John
 
J

jwwarrenva

Randy,

Thanks, I tried your function on a longish file and it seems to work.
I'm at home now and need to be at work to run a better test, but I'll
try it and let you know how things work out. I'll also check the
length of the string returned by the original version.

John- Hide quoted text -

- Show quoted text -

OK, I took a better look at the page I was trying to download and I
now see that it's more complicated than I realized. I thought I was
attempting a simple download, but the page was actually some kind of
aspx thing that runs a javascript when the "link" to the target file
is clicked. So when I tried to download the file via xmlhttp I was
actually getting the aspx page instead of the file I wanted. Xmlhttp
is working correctly, but I haven't got a clue what I need to do
automate my download.

If anyone has any suggestions I would interested in seeing them. I'm
thinking about giving up at this point, since I can see I am in over
my head.

John
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top