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
# 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 等を使って
「どのファイルの、何バイト目から何バイト目を受信したいか」を
指示するようにし、サーバ側プログラムでは、その指定に応じて、
指定されたファイルの特定バイト位置のデータを返すようにするといった
対応が必要になるかも知れません。
魔界の仮面弁士さん、アドバイスありがとうございます。
VBのコードをちょいといじるだけ、というわけには行かないようですね。
自分がサーバー(Linuxです。)管理者なので、
CGIだろうが何だろうが好きに用意できるので、
CGIでの実装も検討してみます。
少し話がそれますが、元々Inetコントロールを使ってFTPにて
実装していたものを、セキュリティの強化ということで、
XMLHTTPを使ってHTTPS通信に変更して現在のような、
実装になりました。
SFTPも検討したのですが、Inetのようなお手軽なものが無くて
断念した経緯があります。
調査不足かもしれませんがVBからSFTPは使えないのでしょうか?