我目前正在为Windows编写一个基于JScript的应用程序,我希望实现一个允许我执行http请求然后以块的形式接收主体并将其保存到硬盘驱动器的功能,而不需要加载过多的数据到RAM的时间。我还希望它是异步的,可以使多个下载和进度条更容易。
我遇到了两个可能能够做我正在寻找的对象:
WinHttp.WinHttpRequest.5.1和Msxml2.XMLHTTP.3.0
它们看起来非常相似,但由于我不需要对XML做任何事情,我想第一个是更好的选择。
这是来自microsoft的异步示例:
var WinHttpReq = new ActiveXObject("WinHttp.WinHttpRequest.5.1"); // Instantiate a WinHttpRequest object.
WinHttpReq.Open("GET", "http://www.microsoft.com", true); // Initialize an HTTP request.
WinHttpReq.Send(); // Send the HTTP request.
WinHttpReq.WaitForResponse(); // Wait for the response.
WScript.Echo( WinHttpReq.ResponseText); // Display the response text.
我缺少的是一种通过小缓冲区接收数据以保存RAM的方法
一旦脚本访问ResponseText,ResponseBody或ResponseStream,整个数据立即写入RAM。由于所有这些属性都是只读的,我不知道如何逐步接收数据。
注意:以下代码不是有效代码,我只想向您展示我正在寻找的示例:
var WinHttpReq = new ActiveXObject("WinHttp.WinHttpRequest.5.1");
WinHttpReq.Open("POST", "http://example.com/VeryBigFile.exe", true);
WinHttpReq.SetCallback(ReceiveData, 1024); //receive data in 1kb chunks
WinHttpReq.Send("accept=yes");
function ReceiveData(data,bytesTotal,bytesLeft) {
BinaryAppendToFile("C:\\VeryBigFile.exe"); //add the data chunks to the file
var percentDownloaded = bytesLeft/bytesTotal;
SetProgressBar1(percentDownloaded); //set a progressbar in my UI
}
编辑:
所以我尝试了评论中的建议,但我无法让它发挥作用
第一个块保存没有问题,但第二个块给我一个错误消息"写入文件失败"。所以我的结论是ADODB.Stream无法附加到现有文件。它可以覆盖文件或给您一个错误。有什么建议吗?
这是我的代码btw:http://pastebin.com/tUEGTBNK
我用这个来测试:
DownloadBody("http://www.piriform.com/ccleaner/download/slim/downloadfile","GET",{},"","C:\\CCS.exe", 500000);