こんにちは。自動化の現場で数々の修羅場をくぐり抜けてきたアーキテクトです。
今日は、VBScriptにおける「大容量ファイルダウンロード」という、一見地味ながらも非常に奥が深いテーマについて解説します。特に、ネットワークが不安定な環境や、数ギガバイトに及ぶファイルを扱う際、「途中で切断されて最初からやり直し」という絶望を回避するための「Rangeリクエスト」を実装する技術をお伝えします。
これができるようになれば、あなたはもう「マクロを動かすだけの人」ではありません。通信の裏側を制御するエンジニアの入り口に立っています。
—
1. なぜ「Rangeヘッダー」が必要なのか?
通常、Webからファイルをダウンロードする際、私たちは「このファイルを全部ください」とリクエストします。しかし、ファイルが巨大な場合、途中でWi-Fiが切れたり、サーバーが過負荷でタイムアウトしたりするリスクが常に付きまといます。
Rangeリクエストとは、サーバーに対して「ファイルの0バイト目からではなく、〇〇バイト目から最後までをください」と指示する仕組みです。
これを使えば、「既にダウンロード済みのデータ」を無駄にせず、続きから再開するという、堅牢な自動化ロジックが構築できます。
—
2. 準備するもの:ServerXMLHTTP オブジェクト
VBScriptでネットワーク通信を行う際、`MSXML2.XMLHTTP`よりも`MSXML2.ServerXMLHTTP`を強く推奨します。後者はサーバーサイドでの利用を想定しており、タイムアウト設定がより柔軟で、安定した通信が可能です。
—
3. 実装の極意:レジューム対応ダウンロードのコード
まずは、このコードを見てください。このコードは「既にファイルが存在していれば、そのサイズを起点に再開する」という処理を実装しています。
‘ 必要なオブジェクトの生成
Set objXML = CreateObject(“MSXML2.ServerXMLHTTP”)
Set objADO = CreateObject(“ADODB.Stream”)
‘ 保存先パスとURL
strURL = “https://example.com/huge-file.zip”
strFilePath = “C:\Downloads\huge-file.zip”
‘ 既存ファイルのサイズを取得(未存在なら0)
Set objFSO = CreateObject(“Scripting.FileSystemObject”)
lngCurrentSize = 0
If objFSO.FileExists(strFilePath) Then
lngCurrentSize = objFSO.GetFile(strFilePath).Size
End If
‘ ストリームを開いて追記モードにする
objADO.Type = 1 ‘ adTypeBinary
objADO.Open
If lngCurrentSize > 0 Then
objADO.LoadFromFile strFilePath
objADO.Position = objADO.Size
End If
‘ リクエスト送信
objXML.Open “GET”, strURL, False
‘ 【重要】Rangeヘッダーで「現在のサイズ-」を指定して続きを要求
If lngCurrentSize > 0 Then
objXML.setRequestHeader “Range”, “bytes=” & lngCurrentSize & “-”
End If
objXML.Send
‘ 応答をストリームに書き込む
If objXML.Status = 206 Or objXML.Status = 200 Then
objADO.Write objXML.ResponseBody
objADO.SaveToFile strFilePath, 2 ‘ adSaveCreateOverWrite
End If
‘ 後片付け
objADO.Close
Set objADO = Nothing
Set objXML = Nothing
—
4. ここで躓きやすいポイント(先輩からのアドバイス)
① ステータスコード「206 Partial Content」を理解する
通常、Webサーバーはリクエストが成功すると「200 OK」を返しますが、Rangeリクエストが正しく受理されると「206 Partial Content」を返します。コード内で `objXML.Status` をチェックする際、この206を許可しておくことが非常に重要です。
② ADODB.Streamの「Position」
`objADO.Position = objADO.Size` という一文が肝です。これがないと、追記ではなくファイルの先頭から上書きされてしまい、データが壊れます。ストリームのカーソルを常に「ファイルの末尾」に移動させることを忘れないでください。
③ サーバー側の対応状況
全てのサーバーがRangeリクエストを受け付けてくれるわけではありません。サーバーが「Accept-Ranges: bytes」というヘッダーを返さない場合、この手法は使えません。通信する前に、まずサーバーが対応しているか確認するのもプロの仕事です。
—
まとめ:自動化の「安定感」は細部に宿る
このロジックをマスターすれば、途中で止まるような不安定なネットワーク環境下でも、業務を確実に完遂できる「信頼性の高いツール」を作れるようになります。
VBScriptは古い言語と言われますが、WindowsのOSの深淵を叩くには今でも最強のツールの一つです。この「通信の制御」という概念は、後のPythonやPowerShellへのステップアップにも必ず役立ちます。
「まずは動くもの」から「止まらないもの」へ。あなたの自動化エンジニアとしての階段を、ここから一段飛ばしで駆け上がっていってください!応援しています。
