MSXML2.XMLHTTP バイナリダウンロードgetpart.lzhVBScript 側で、MSXML2.XMLHTTPを用いてデータをダウンロードするので、 1回のリクエストで大きなファイルをダウンロードしようとすると、メモリ を圧迫する事になります。 ですから、サーバー側で分割の対処を行って対応し、 クライアント側では COPY コマンドの結合書式で連結します。 他にいくらでも代替の手段があるので、全く実用的ではありませんが、 バッチ処理の1つのテクニックとして価値あるかもしれません。 今回やってみて解ったのは、Msxml2.ServerXMLHTTP( サーバーオブジェクト ) を使用すると連続実行ができず、以下のようなエラーが出る場合があります スクリプト: C:\Documents and .... 行: 22 文字: 2 エラー: An internal response header size limit was exceeded コード: 80072F97 ソース: msxml3.dll ※ 結局、IE 依存環境の MSXML2.XMLHTTP で実行すると動作しましたが、 ※ 環境によって結果が異なる可能性があります getpart.php
<? header( "Content-Type: application/octet-stream" ); header( "Expires: Wed, 31 May 2000 14:59:58 GMT" ); $fp = fopen( $_GET['file'], 'rb' ); // $n から $len の長さを出力 $p = $_GET['part']+0; $n = $_GET['target']+0; $len = filesize($_GET['file']); $len = $len / $p; $len = floor( $len ); if ( $p == $n ) { fseek( $fp, ($n-1)*$len, SEEK_SET ); $len = filesize($_GET['file'])-$len*($p-1); } else { fseek( $fp, ($n-1)*$len, SEEK_SET ); } if ( $fp ) { $ret = fread( $fp, $len ); print $ret; fclose( $fp ); } ?> getpart.vbs
Set objSrvHTTP = Wscript.CreateObject("MSXML2.XMLHTTP") Set Stream = Wscript.CreateObject("ADODB.Stream") Set WshShell = CreateObject( "WScript.Shell" ) strUrl = "http://lightbox.on.coocan.jp/download/getpart.php" strUrl = strUrl & "?file=WinOfSql102.lzh" strUrl = strUrl & "&part=10&target=" strCommand = "" For I = 1 To 10 on error resume next Call objSrvHTTP.Open("GET", strUrl & I, False ) if Err.Number <> 0 then Wscript.Echo Err.Description Wscript.Quit end if on error goto 0 objSrvHTTP.Send Stream.Open Stream.Type = 1 ' バイナリ Stream.Write objSrvHTTP.responseBody Stream.SaveToFile "WinOfSql102." & I, 2 Stream.Close if strCommand <> "" then strCommand = strCommand & " + " end if strCommand = strCommand & "WinOfSql102." & I & " /B " Next strCommand = "cmd.exe /c copy " & strCommand & " WinOfSql102_join.lzh /B" Call WshShell.Run( strCommand, 0, True ) |