現在、ニュースシステムや記事システムではWEBベースのHTMLエディタが多く使われており、ネットワークを貼り付ければ元のスタイルを維持でき、画像も保持できます。ただし、使用中に貼り付けた写真を削除すると、顔に大きな「X」が残り、見た目に影響します。以前はこの画像を保存してから再度サーバーにアップロードする必要があり、とても面倒でした。サーバーは自動的に画像をダウンロードしてサーバーに保存し、ページ上のリンクを置き換えることはできますか?答えは「はい」です。
この機能を実装するには、次の 3 つの手順が必要です。
1. 元の画像のアドレスを取得します。多くの方法があり、文字列の分割を使用したり、通常のマッチングを使用したりできます。実践により、定期的なマッチングが最も簡単であることが証明されています。解析された画像のアドレスは<img>タグに保存されます。まずこのタグをすべて取得します。プロセスは次のとおりです。
Set objRegExp = 新しい正規表現の設定オブジェクト
objRegExp.IgnoreCase = True'大文字と小文字を区別しない
objRegExp.Global = True' を全文検索に設定
objRegExp.Pattern = "<img.+?>"'画像アドレスを正確に取得できるようにするために、構成は 2 つのレベルに分かれています。最初に内部の <img> タグを見つけ、次に画像アドレスを取得します。内部には getimgs 関数が実装されています。
strs=トリム(str)
Set Matches =objRegExp.Execute(strs)'設定の実行を開始します
試合中の各試合について
RetStr = RetStr &getimgs( Match.Value )'2 回目のマッチングを実行します。
Next
のすべての画像には
src="http://image address" があるため、次のように正確な画像アドレスを取得できます。
関数 getimgs(str)
getimgs=""
objRegExp = 新しい正規表現を設定します
objRegExp.IgnoreCase = True
objRegExp.Global = True
objRegExp.Pattern = " http://.+?"""'内のアドレスを取り出します
set mm=objRegExp.Execute(str)
mm 単位の各一致について
getimgs=getimgs&"||"&left(Match.Value,len(Match.Value)-)' 後で使用するための内部アドレスの文字列
次
end 関数は
すべての画像のアドレスを取得したので、2 番目のステップに進むことができます。
次に、画像をダウンロードしてサーバーに保存します。これは 2 つのステップに分けることができます。1 つは画像のコンテンツを取得するステップで、もう 1 つは画像をサーバーに保存するステップです。画像のコンテンツの取得は、次の関数によって実現されます。
関数 getHTTPage(url)
エラー時は次から再開
薄暗いhttp
set http=server.createobject("MSXML.XMLHTTP")'xmlhttp メソッドを使用して画像のコンテンツを取得します
http.open "GET",url,false
Http.send()
if Http.readystate<> then
終了関数
終了する場合
getHTTPPage=Http.responseBody
http=何も設定しない
if err.number<>0 then err.Clear
終了関数
画像の内容を取得したら、それを保存する必要があります。これは FSO で実行できるように思われますが、実際には、FSO はストリーミングをサポートしていないため、この方法では保存できません。ファイルがあるため、別のオブジェクト:ADO.STREM を呼び出す必要があります。具体的なプロセスは次のとおりです。
関数 saveimage(from,tofile)
dim geturl、objStream、imgs
geturl=トリム(から)
imgs=gethttppage(geturl)'画像の特定のコンテンツを取得するプロセス
Set objStream = Server.CreateObject("ADODB.Stream")' ADODB.Stream オブジェクトを作成するには、ADO 以降が必要です。
objStream.Type ='バイナリモードで開く
objStream.Open
objstream.write imgs' は文字列の内容をバッファに書き込みます
objstream.SaveToFile server.mappath(tofile),' - バッファリングされたコンテンツをファイルに書き込みます
objstream.Close()'オブジェクトを閉じる
objstream = なしを設定します
終了関数
したがって、ループを使用して、取得したアドレスにすべての画像を保存するだけです。具体的なプロセスは次のとおりです。
arrimg=split(retstr,"||")'文字列を分割し、その中のアドレスリストを取得します
allimg=""
newimg=""
for i= から ubound(arrimg)
if arrimg(i)<>"" and instr(allimg,arrimg(i))< then' この画像がダウンロードされているかどうかを確認します
fname=baseurl&cstr(i&mid(arrimg(i),instrrev(arrimg(i),".")))
saveimage(arrimg(i),fname)' 関数でアドレスを保存します。上記のプロセスを参照してください。
allimg=allimg&"||"&arrimg(i)' 保存された画像のアドレスを文字列化して、置換するアドレスを決定します
newimg=newimg&"||"&fname' ローカル アドレスを結合した文字列
終了する場合
次
3 番目のステップは、元のアドレスを置き換えることです。具体的なプロセスは次のとおりです。
arrnew=split(newimg,"||")'元の画像アドレスリストを取得
arrall=split(allimg,"||")'保存されている写真のアドレス一覧を取得
for i= to ubound(arrnew)' はループを実行して元のアドレスを置き換えます
strs=replace(strs,arrall(i),arrnew(i))
次
cctv=strs
ただし、この機能の基本的なプロセスは次のとおりです。もちろん、画像サイズの制限を追加したり、画像の重複を避けるためにローカル マシンでの画像のダウンロードに制限を追加したりするように変更することもできます。 。同時に、この関数の欠点は、静的な画像ファイルのみを処理でき、プログラムによって生成された画像には使用できないことにも注意する必要があります。