アイデアの作成:クライアント上でローカル ファイルを Base64 でエンコードし、宛先に送信します。
テスト中に、アップロードされたファイルが大きすぎるため、タイムアウトが発生して失敗しました。
その後、20M のエンコードが成功するように改善されました。
作成の目的:従来のソリューションでは、一度に 1 つずつ選択してアップロードできますが、データベース内のファイル パスを読み取り、これらのファイルを 1 か所にアップロードするのはさらに面倒です。
もちろん、ftp を使用してパスを 1 つずつ見つけることもできますが、毎回これらのファイルを見つけるのは時間がかかります。ここでこれを書く目的は主に、データベース内のファイル パスを通じてファイルを取得し、ファイルを一度に 1 か所にバッチでアップロードすることです。
主な目的は自分自身を鍛えることです。
解決プロセス:最初は、シミュレートされたキーボード入力を使用してファイル コントロールに値を強制的に割り当て、従来の方法を使用してアップロードしようとしました。しかし、常に null 値が発生し、多くのファイルが送信されません。いくつかの情報を参考にした後、データベースからすべてのパスを取得し、それらを js に書き込みます。次に、フロント デスクで js を使用してこれらのパスを読み取り、xmlhttp 経由でファイルを送信します。
Internet Explorer は xmlHttp があまり好きではなく、悪意のある動作があると常に考えているため、操作中に Web パスを使用することはできず、物理パスを使用することしかできません。
次に、サーバーにはこれらのエンコードを受信してデコードするためのファイルがあるので、それを c/s と呼びます。
現在、多くのコードがまだ改良中です。
簡単な紹介:
-------------------------------------------------- ----------
aryFiles.push(c://aaa.zip);
aryFiles.push(c://bbb.exe);
ここにファイルのパスとファイルを指定します。複数にすることもできます。
将来的には、このパスはファイル コントロールを介してクライアントでも取得できるようになります。
http://www.xxx.com/xxx/xxx.asp
これが宛先です。ご希望のアドレスに変更できます。
ado_stream.LoadFromFile(server.mappath(.) &/& + str_filename)
server.mappath(.) &/& + str_filename 読み取るファイルは次のとおりです。
server.mappath(.) &/& パスはストレージ パスと一致しています
ado_stream.SaveToFileserver.mappath(.) &/& str_filename,2
server.mappath(.) &/& これはファイルを保存するパスです。str_filename はファイル名です。
ここでの読み込みと保存はプログラムが置かれているディレクトリに置かれます。テスト時にこのようにしておくこともできます。
コードの最初の部分をローカルに配置します (例:c:/upload.htm)
2 番目のコードをサーバーに配置します。これは、ローカル サーバーでもパブリック サーバーでも構いません。上記の宛先との一貫性を保ちます。
(例:http://www.xxx.com/upload.asp または http://localhost/www/upload.asp)
-------------------------------------------------- ---------------
処置: コードの最初の部分が保存されている場所を見つけてください。それを実行するだけです (例: C ドライブを開いて、upload.htm を実行します)
クライアント コード</P><P><html><head></head><body> <input type=button onclick=BeginSendFiles() value=Send/> <input type=button onclick=JavaScript: Breaked= true ; 値=割り込み/> <div id=ddd width=300px></div> </br> <DIV id=div_message></DIV></body></P><P><script language=VBScript>Function bytes2BSTR(vIn) strReturn = For i = 1 To LenB(vIn) ThisCharCode = AscB(MidB(vIn,i ,1)) If ThisCharCode < &H80 then strReturn = strReturn & Chr(ThisCharCode) Else NextCharCode = AscB(MidB(vIn,i+1,1)) strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode)) i = i + 1 End If Next bytes2BSTR = strReturnEnd 関数</script></P ><P><スクリプト言語=javascript> var xmlhttp; var mFileName、mPartStart; mPartID, mPartEnd; var BlockSize; var aryFiles; // 毎回送信されるバイト数 = false; P> P><P> // ファイル送信開始 function BeginSendFiles() { initAryFiles(); } // 送信するファイルの配列を構築します function initAryFiles() { aryFiles.push(c://aaa.zip) ;//c://aaa. zip c ://bbb.exe local file aryFiles.reverse() ;//ファイル名}</P><P> function SendFile(vFullPath) { //次の場合、空のファイルはアップロードされません(!vFullPath) { return ; } 壊れた = false ; ado_stream = new ActiveXObject(ADODB.Stream) // ファイル ストリームを読み込みます ado_stream.Open(); ); // ファイルを読み取ります ado_stream.position = 0;</P><P> SendCount = Math.ceil(ado_stream.size/BlockSize) ; // 残りがある場合はもう一度送信します</P><P> //alert(SendCount) ;</P><P> var reg = //b /w+./w+$/gi mFileName = reg.exec(vFullPath) ; mPartID = 1 ; }</P><P> 関数 SendData() { if (SendCount > 0) { var dom = new ActiveXObject(msxml2.DOMDocument) // XML ファイルを送信します dom.async = false; dom.resolveExternals = false; </P><P> // XML ファイルのヘッダー var を構築しますノード = dom.createProcessingstruct(xml,version='1.0'); ノード = null;ルート ノードを構築します。 var root = dom.createElement(root); dom.documentElement.setAttribute(xmlns:dt, urn:schemas-microsoft-com:datatypes); // 保存するノードの更新データを構築します。バイナリデータ ノード = dom.createElement(upData); ノード.データタイプ = bin.base64; Base64 エンコーディング var att = dom.createAttribute(FileName); // ファイル名属性 att.value = mFileName; node.setAttribute(att); // セクション開始マーク att; .value = mPartStart; ノード.setAttributeNode(att); var att = dom.createAttribute(PartID);セクション番号 att.value = mPartID(att); att = dom.createAttribute(PartEnd); // セクション終了マーク att.value = mPartEnd; ;</P><P> root.appendChild(node) ; node.nodeTypedValue = ado_stream.Read(BlockSize);ノード データはストリームから読み取られ、固定長のノード = null; xmlhttp = new ActiveXObject(Microsoft.XMLHTTP); false); //http://www.xxx.com/xxx/xxx.asp は Web パス上のファイルです。xmlhttp.onreadystatechange=xmlhttp.send(dom); = null ; } else { ado_stream.Close(); ado_stream = null ; } } function CallBack() { // アップロードが成功したかどうかを確認します if(xmlhttp.readystate == 4) { // アップロードが中断されたかどうかを確認しますreturn ; }</P><P> if (SendCount > 0) { // div_message.innerHTML += ( + xmlhttp.ResponseText) ; var p = Math.floor((mPartID/(Math.ceil(ado_stream.size/BlockSize) + 1)) * 100) // 進行状況の割合を計算しますShowBar(p) ; );, 1) ; } else { // ファイル転送が完了しました //div_message.innerHTML += mFileName +転送完了! ;</P><P> // 次のファイルを渡します ShowBar(0) var cFile = aryFiles.pop() } } </P><P> }</P>< P > function ShowBar(per) { // プログレスバー ddd.innerHTML = <table width='200' border=0 cellpadding='0' cellpacing='0' ><tr><td bgcolor='#6699FF'><input type=button style=' width: + per + % ; border:#005599; color:#FFFFFF' value= + per + %> </td></tr ></テーブル> }</P><P></script></html></P><P>
サーバー側
</P><P><%@ LANGUAGE=VBScript%><% Option ExplicitResponse.Expires = 0 </P><P>' 変数とオブジェクトを定義します。 dim ado_streamdim xml_domdim xml_datadim str_filenamedim bol_PartStartdim int_PartIDdim bol_PartEnd </P><P>' ストリーム オブジェクトの作成 set ado_stream = Server.CreateObject(ADODB.Stream)' リクエスト オブジェクトから XMLDOM オブジェクトを作成 set xml_dom = Server.CreateObject(MSXML2.DOMDocument)xml_dom.load(request)' バイナリ データ セットを含むノードを読み出します xml_data = xml_dom.selectSingleNode(root/upData)str_filename = xml_data.getAttribute(FileName)bol_PartStart = CBool(xml_data.getAttribute(PartStart) ))int_PartID = CInt(xml_data.getAttribute(PartID))bol_PartEnd = CBool(xml_data.getAttribute(PartEnd))</P><P>' Stream オブジェクトを開いてデータを格納します ado_stream.Type = 1 ' 1=adTypeBinary ado_stream.open bol_PartStart でない場合は、 ado_stream.LoadFromFile(server.mappath(.) &/& + str_filename) 'ファイルを読み取ります ado_stream.position = ado_stream.sizeend ifado_stream.Write xml_data.nodeTypedValue' ファイルを保存 ado_stream.SaveToFile server.mappath(.) &/& str_filename,2' ファイルを保存 2=adSaveCreateOverWrite ado_stream.close </P><P> 'リソースを解放 set ado_stream = なし set xml_dom = なし'ブラウザに情報を返します Response.Write アップロード成功!& str_filename & int_PartID & bol_PartStart%> </P><P>