Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(Classic ASP) HTTP Download in Parallel with Simultaneous Range RequestsDemonstrates how to download a large file with parallel simultaneous requests, where each request downloads a segment (range) of the remote file.
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <body> <% ' This requires the Chilkat API to have been previously unlocked. ' See Global Unlock Sample for sample code. ' For versions of Chilkat < 10.0.0, use CreateObject("Chilkat_9_5_0.Http") set http = Server.CreateObject("Chilkat.Http") ' First get the size of the file to be downloaded. url = "https://www.chilkatsoft.com/hamlet.xml" ' resp is a Chilkat.HttpResponse Set resp = http.GetHead(url) If (http.LastMethodSuccess = 0) Then Response.Write "<pre>" & Server.HTMLEncode( http.LastErrorText) & "</pre>" Response.End End If remoteFileSize = resp.ContentLength Response.Write "<pre>" & Server.HTMLEncode( "Downloading " & remoteFileSize & " bytes...") & "</pre>" ' Let's download in 4 chunks. ' (the last chunk will be whatever remains after the 1st 3 equal sized chunks) chunkSize = remoteFileSize / 4 ' The Range header is used to download a range from a resource ' Range: bytes=<range-start>-<range-end> ' or ' Range: bytes=<range-start>- ' We're writing code this way for clarity.. ' For versions of Chilkat < 10.0.0, use CreateObject("Chilkat_9_5_0.Http") set http1 = Server.CreateObject("Chilkat.Http") ' For versions of Chilkat < 10.0.0, use CreateObject("Chilkat_9_5_0.Http") set http2 = Server.CreateObject("Chilkat.Http") ' For versions of Chilkat < 10.0.0, use CreateObject("Chilkat_9_5_0.Http") set http3 = Server.CreateObject("Chilkat.Http") ' For versions of Chilkat < 10.0.0, use CreateObject("Chilkat_9_5_0.Http") set http4 = Server.CreateObject("Chilkat.Http") ' For versions of Chilkat < 10.0.0, use CreateObject("Chilkat_9_5_0.StringBuilder") set sbRange = Server.CreateObject("Chilkat.StringBuilder") success = sbRange.SetString("bytes=<range-start>-<range-end>") numReplaced = sbRange.ReplaceI("<range-start>",0) numReplaced = sbRange.ReplaceI("<range-end>",chunkSize - 1) Response.Write "<pre>" & Server.HTMLEncode( sbRange.GetAsString()) & "</pre>" http1.SetRequestHeader "Range",sbRange.GetAsString() success = sbRange.SetString("bytes=<range-start>-<range-end>") numReplaced = sbRange.ReplaceI("<range-start>",chunkSize) numReplaced = sbRange.ReplaceI("<range-end>",2 * chunkSize - 1) Response.Write "<pre>" & Server.HTMLEncode( sbRange.GetAsString()) & "</pre>" http2.SetRequestHeader "Range",sbRange.GetAsString() success = sbRange.SetString("bytes=<range-start>-<range-end>") numReplaced = sbRange.ReplaceI("<range-start>",2 * chunkSize) numReplaced = sbRange.ReplaceI("<range-end>",3 * chunkSize - 1) Response.Write "<pre>" & Server.HTMLEncode( sbRange.GetAsString()) & "</pre>" http3.SetRequestHeader "Range",sbRange.GetAsString() success = sbRange.SetString("bytes=<range-start>-") numReplaced = sbRange.ReplaceI("<range-start>",3 * chunkSize) Response.Write "<pre>" & Server.HTMLEncode( sbRange.GetAsString()) & "</pre>" http4.SetRequestHeader "Range",sbRange.GetAsString() ' Start each range download ' task1 is a Chilkat.Task Set task1 = http1.DownloadAsync(url,"qa_output/chunk1.dat") success = task1.Run() ' task2 is a Chilkat.Task Set task2 = http2.DownloadAsync(url,"qa_output/chunk2.dat") success = task2.Run() ' task3 is a Chilkat.Task Set task3 = http3.DownloadAsync(url,"qa_output/chunk3.dat") success = task3.Run() ' task4 is a Chilkat.Task Set task4 = http4.DownloadAsync(url,"qa_output/chunk4.dat") success = task4.Run() ' Wait for the downloads to complete. numLive = 4 Do While numLive > 0 numLive = 0 If (task1.Live = 1) Then numLive = numLive + 1 End If If (task2.Live = 1) Then numLive = numLive + 1 End If If (task3.Live = 1) Then numLive = numLive + 1 End If If (task4.Live = 1) Then numLive = numLive + 1 End If If (numLive > 0) Then ' SleepMs is a convenience method to cause the caller to sleep for N millisec. ' It does not cause the given task to sleep.. task1.SleepMs 10 End If Loop ' All should be downloaded now.. ' Examine the result of each Download. numErrors = 0 If (task1.GetResultBool() = 0) Then Response.Write "<pre>" & Server.HTMLEncode( task1.ResultErrorText) & "</pre>" numErrors = numErrors + 1 End If If (task2.GetResultBool() = 0) Then Response.Write "<pre>" & Server.HTMLEncode( task2.ResultErrorText) & "</pre>" numErrors = numErrors + 1 End If If (task3.GetResultBool() = 0) Then Response.Write "<pre>" & Server.HTMLEncode( task3.ResultErrorText) & "</pre>" numErrors = numErrors + 1 End If If (task4.GetResultBool() = 0) Then Response.Write "<pre>" & Server.HTMLEncode( task4.ResultErrorText) & "</pre>" numErrors = numErrors + 1 End If If (numErrors > 0) Then Response.End End If ' All downloads were successful. ' Compose the file from the parts. ' For versions of Chilkat < 10.0.0, use CreateObject("Chilkat_9_5_0.FileAccess") set fac = Server.CreateObject("Chilkat.FileAccess") success = fac.ReassembleFile("qa_output","chunk","dat","qa_output/hamlet.xml") If (success = 0) Then Response.Write "<pre>" & Server.HTMLEncode( fac.LastErrorText) & "</pre>" Else Response.Write "<pre>" & Server.HTMLEncode( "Success.") & "</pre>" End If ' Let's download in the regular way, and then compare files.. success = http.Download(url,"qa_output/hamletRegular.xml") ' Compare files. bSame = fac.FileContentsEqual("qa_output/hamlet.xml","qa_output/hamletRegular.xml") Response.Write "<pre>" & Server.HTMLEncode( "bSame = " & bSame) & "</pre>" %> </body> </html> |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.