MSXML.XMLHTTPRequestで大容量ファイルをダウンロードするには?


若芽  2004-06-01 20:51:18  No: 83693  IP: [192.*.*.*]

Apache + WebDav のサーバーから、ファイルをダウンロードする
プログラム(VB6.0にて作成)をMSXML.XMLHTTPRequestを用いて作っております。

プログラム自体は問題なく動作しているのですが、ダウンロードするファイルのサイズが大きくなる(100MB超)と、メモリ不足のエラーが発生してしまいます。PCの仮想メモリを大きくすればメモリ不足は出なくなるのですが、
本質的な解決になっていない気がします。

PCのスペックに依存せずに大容量のファイルをダウンロードさせる方法はないのでしょうか?

'ファイルのダウンロード
Dim objHttp As New MSXML.XMLHTTPRequest
objHttp.Open "GET", URL , False, UserName, PassWord
objHttp.send

'ファイルの保存
Dim bin() As Byte
bin = objHttp.responseBody
Dim F As Integer
F = FreeFile()
Open FileName For Binary As #F
Put #F, , bin()
Close #F

編集    削除
魔界の仮面弁士  2004-06-02 00:42:33  No: 83694  IP: [192.*.*.*]

# Apacheは良く知らないので、XMLHTTP側の話だけ反応…。


> ファイルのサイズが大きくなる(100MB超)と、メモリ不足のエラー
XMLHTTPのリクエストにより、100MB分のデータがストリームに入り、
しかもそれが、「Dim bin() As Byte」にもコピーされるわけですから、
単純計算で 200MBを超えるメモリが必要になりますね。


> PCのスペックに依存せずに大容量のファイルをダウンロードさせる方法はないのでしょうか?
この場合、分割ダウンロードという作業が必要になると思います。
(例えば、5MB単位でダウンロードするようにしてみるとか)

となると、リクエストヘッダに Range ヘッダフィールドを含めて、
部分的 GET に修正したい所ですが…XMLHTTPは HTTP/1.1ではなく、
1.0なので、Rangeフィールドが定義されていません。


…もし、サーバ側にcgi, jsp等のサーバ側プログラムを用意できるなら、
VB側から、リクエストヘッダ、あるいは QUERY_STRING 等を使って
「どのファイルの、何バイト目から何バイト目を受信したいか」を
指示するようにし、サーバ側プログラムでは、その指定に応じて、
指定されたファイルの特定バイト位置のデータを返すようにするといった
対応が必要になるかも知れません。

編集    削除
若芽  2004-06-02 21:17:36  No: 83695  IP: [192.*.*.*]

魔界の仮面弁士さん、アドバイスありがとうございます。

VBのコードをちょいといじるだけ、というわけには行かないようですね。
自分がサーバー(Linuxです。)管理者なので、
CGIだろうが何だろうが好きに用意できるので、
CGIでの実装も検討してみます。

少し話がそれますが、元々Inetコントロールを使ってFTPにて
実装していたものを、セキュリティの強化ということで、
XMLHTTPを使ってHTTPS通信に変更して現在のような、
実装になりました。
SFTPも検討したのですが、Inetのようなお手軽なものが無くて
断念した経緯があります。
調査不足かもしれませんがVBからSFTPは使えないのでしょうか?

編集    削除