MSXML2.XMLHTTP バイナリダウンロードgetpart.lzhVBScript 側で、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 ) |