PHP + VBS 分割ダウンロード

MSXML2.XMLHTTP バイナリダウンロード
getpart.lzh
VBScript 側で、MSXML2.XMLHTTPを用いてデータをダウンロードするので、
1回のリクエストで大きなファイルをダウンロードしようとすると、メモリ
を圧迫する事になります。

ですから、サーバー側で分割の対処を行って対応し、
クライアント側では COPY コマンドの結合書式で連結します。

他にいくらでも代替の手段があるので、全く実用的ではありませんが、
バッチ処理の1つのテクニックとして価値あるかもしれません。

今回やってみて解ったのは、Msxml2.ServerXMLHTTP( サーバーオブジェクト )
を使用すると連続実行ができず、以下のようなエラーが出る場合があります
1.スクリプト:  C:\Documents and ....
2.行:  22
3.文字: 2
4.エラー:    An internal response header size limit was exceeded
5. 
6.コード: 80072F97
7.ソース: msxml3.dll
※ 結局、IE 依存環境の MSXML2.XMLHTTP で実行すると動作しましたが、
※ 環境によって結果が異なる可能性があります
getpart.php
01.<?
02.header( "Content-Type: application/octet-stream" );
03.header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
04. 
05.$fp = fopen( $_GET['file'], 'rb' );
06. 
07.// $n から $len の長さを出力
08. 
09.$p = $_GET['part']+0;
10.$n = $_GET['target']+0;
11.$len = filesize($_GET['file']);
12. 
13.$len = $len / $p;
14.$len = floor( $len );
15.if ( $p == $n ) {
16.    fseek( $fp, ($n-1)*$len, SEEK_SET );
17.    $len = filesize($_GET['file'])-$len*($p-1);
18.}
19.else {
20.    fseek( $fp, ($n-1)*$len, SEEK_SET );
21.}
22. 
23.if ( $fp ) {
24. 
25.    $ret = fread( $fp, $len );
26.    print $ret;
27. 
28.    fclose( $fp );
29.}
30. 
31.?>
getpart.vbs
01.Set objSrvHTTP = Wscript.CreateObject("MSXML2.XMLHTTP")
02.Set Stream = Wscript.CreateObject("ADODB.Stream")
03.Set WshShell = CreateObject( "WScript.Shell" )
04. 
05.strUrl = "http://lightbox.on.coocan.jp/download/getpart.php"
06.strUrl = strUrl & "?file=WinOfSql102.lzh"
07.strUrl = strUrl & "&part=10&target="
08. 
09.strCommand = ""
10. 
11.For I = 1 To 10
12. 
13.    on error resume next
14.    Call objSrvHTTP.Open("GET", strUrl & I, False )
15.    if Err.Number <> 0 then
16.        Wscript.Echo Err.Description
17.        Wscript.Quit
18.    end if
19.    on error goto 0
20. 
21.    objSrvHTTP.Send
22. 
23.    Stream.Open
24.    Stream.Type = 1 ' バイナリ
25.    Stream.Write objSrvHTTP.responseBody
26.    Stream.SaveToFile "WinOfSql102." & I, 2
27.    Stream.Close
28. 
29.    if strCommand <> "" then
30.        strCommand = strCommand & " + "
31.    end if
32. 
33.    strCommand = strCommand & "WinOfSql102." & I & " /B "
34. 
35.Next
36. 
37.strCommand = "cmd.exe /c copy " & strCommand & " WinOfSql102_join.lzh /B"
38. 
39.Call WshShell.Run( strCommand, 0, True )