Schreibidee: Kodieren Sie die lokale Datei mit base64 auf dem Client und senden Sie sie dann an das Ziel.
Während des Tests war die hochgeladene Datei zu groß, was zu einer Zeitüberschreitung und einem Fehler führte.
Später wurde die Kodierung in Segmenten verbessert. Der Test von 20M war erfolgreich.
Zweck des Schreibens: Bei der herkömmlichen Lösung können Sie eine nach der anderen auswählen und hochladen. Allerdings ist es schwieriger, die Dateipfade in der Datenbank zu lesen und diese Dateien an einen Ort hochzuladen.
Es ist natürlich möglich, die Pfade einzeln über FTP zu finden, aber es wird für mich jedes Mal zeitaufwändiger sein, diese Dateien zu finden. Der Zweck dieses Schreibens besteht hauptsächlich darin, Dateien über den Dateipfad in der Datenbank abzurufen und Dateien stapelweise an einen Ort hochzuladen.
Der Hauptzweck besteht darin, sich selbst zu trainieren.
Lösungsprozess: Zuerst habe ich versucht, mithilfe einer simulierten Tastatureingabe dem Dateisteuerelement zwangsweise Werte zuzuweisen und es mit der herkömmlichen Methode hochzuladen. Aber ich stoße immer auf Nullwerte und selbst viele Dateien werden nicht versendet. Nachdem ich einige Informationen konsultiert habe, rufe ich jetzt alle Pfade durch die Datenbank ab und schreibe sie in ein JS. Verwenden Sie dann js an der Rezeption, um diese Pfade zu lesen und die Datei über xmlhttp zu senden.
Da Internet Explorer xmlHttp nicht besonders mag und immer denkt, dass es sich bösartig verhält, gibt es daher immer Warnungen aus. Daher können Sie während des Betriebs nicht auf den physischen Pfad zugreifen.
Dann verfügt der Server über eine Datei, um diese Kodierungen zu empfangen und zu dekodieren. Ich nenne sie also ^_^
Derzeit werden viele Codes noch verbessert.
Eine kurze Einführung:
-------------------------------------------------- ----------
aryFiles.push(c://aaa.zip);
aryFiles.push(c://bbb.exe);
Hier ist der Dateipfad und die Datei. Es können mehrere sein
Zukünftig kann dieser Pfad auch auf dem Client über die Dateisteuerung ermittelt werden.
http://www.xxx.com/xxx/xxx.asp
Dies ist das Ziel. Sie können es in die gewünschte Adresse ändern.
ado_stream.LoadFromFile(server.mappath(.) &/& + str_filename)
server.mappath(.) &/& + str_filename Hier ist die zu lesende Datei.
server.mappath(.) &/& Der Pfad stimmt mit dem Speicherpfad überein
ado_stream.SaveToFile server.mappath(.) &/& str_filename,2
server.mappath(.) &/& Dies ist der Pfad zum Speichern der Datei. str_filename ist der Dateiname
Das Lesen und Speichern erfolgt hier in dem Verzeichnis, in dem das Programm abgelegt ist. Sie können es auch beim Testen so belassen.
Platzieren Sie den ersten Codeabschnitt lokal (z. B. c:/upload.htm).
Legen Sie den zweiten Codeabschnitt auf dem Server ab. Dabei kann es sich um einen lokalen Server oder einen öffentlichen Server handeln. Achten Sie darauf, dass er mit dem oben genannten Ziel übereinstimmt.
(z. B. http://www.xxx.com/upload.asp oder http://localhost/www/upload.asp)
-------------------------------------------------- ---------------
Aktion: Finden Sie heraus, wo der erste Codeabschnitt gespeichert ist. Führen Sie es einfach aus (z. B. öffnen Sie das Laufwerk C und führen Sie upload.htm aus).
Client-Code</P><P><html><head></head><body> <input type=button onclick=BeginSendFiles(); value=Send/> <input type=button onclick=JavaScript: Breaked= true ; value=interrupt/> <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 Function</script></P ><P><script language=javascript> var xmlhttp; var ado_stream; mPartID, mPartEnd; var BlockSize; var aryFiles; //Die Anzahl der gesendeten Bytes timeBreaked = false; P> P><P> // Dateien senden function BeginSendFiles() { initAryFiles(); } // Ein Array von zu sendenden Dateien erstellen function initAryFiles() { aryFiles.push(c://aaa.zip) ;//c://aaa. zip c ://bbb.exe lokale Datei aryFiles.reverse() ;//Dateiname}</P><P> function SendFile(vFullPath) { // Leere Datei wird nicht hochgeladen, wenn (!vFullPath) { return ; ado_stream = new ActiveXObject(ADODB.Stream); // Den Dateistrom lesen ado_stream.Open(); ); // Die Datei lesen ado_stream.position = 0;</P><P> SendCount = Math.ceil(ado_stream.size/BlockSize) ; // Wenn es einen Rest gibt, noch einmal senden</P><P> // alarm(SendCount) ;</P><P> var reg = //b /w+. /w+$/gi mFileName = reg.exec(vFullPath) ; mPartEnd = false ; { if (SendCount > 0) { dom = new ActiveXObject(msxml2.DOMDocument); // XML-Datei senden dom.async = false;</P><P> // XML-Dateiheader erstellen var node = dom.createProcessingInstruction(xml,version='1.0'); Konstruieren Sie den Stammknoten var root = dom.createElement(root); dom.appendChild(root); dom.documentElement.setAttribute(xmlns:dt, urn:schemas-microsoft-com:datatypes); // Konstruieren Sie die zu speichernden Knotenaktualisierungen Binärdaten node = dom.createElement(upData); node.dataType = bin.base64; // bin. base64-Kodierung var att = dom.createAttribute(FileName); // Dateiname attribute att.setAttributeNode(att); // Abschnittsstartmarkierung att .value = mPartStart; node.setAttributeNode(att); att = null; Abschnittsnummer att.value = mPartID; att = null; var att = dom.createAttribute(PartEnd); ;</P><P> root.appendChild(node) ; node.nodeTypedValue = ado_stream.Read(BlockSize); Knotendaten werden aus dem Stream gelesen, feste Länge node = null; SendCount -= 1; false); //http://www.xxx.com/xxx/xxx.asp ist die Datei im Webpfad xmlhttp.onreadystatechange= CallBack; mPartStart = false; = null ; } else { ado_stream.Close(); ado_stream = null ; } function CallBack() { // Hochladen erfolgreich if(xmlhttp.readystate == 4) { // Prüfen, ob der Upload unterbrochen wurde return ; }</P><P> if (SendCount > 0) { mPartID += 1; // div_message.innerHTML += ( + xmlhttp.ResponseText) ; var p = Math.floor((mPartID/(Math.ceil(ado_stream.size/BlockSize) + 1)) * 100) ; // Fortschrittsprozentsatz berechnen var t = setTimeout(SendData ( );, 1) ; } else { // Dateiübertragung abgeschlossen //div_message.innerHTML += mFileName + Übertragung abgeschlossen! ;</P><P> // Weiter mit der Weitergabe der nächsten Datei ShowBar(0) ; var cFile = aryFiles.pop() } } </P><P> </P>< P > function ShowBar(per) { // Fortschrittsbalken ddd.innerHTML = <table width='200' border=0 cellpadding='0' Cellspacing='0' ><tr><td bgcolor='#6699FF'><input type=button style=' width: + per + % ; border:0px; color:#005599; value= + per + %> </td></tr ></table> ; </P><P></script></html></P><P>
serverseitig
</P><P><%@ LANGUAGE=VBScript%><% Option ExplicitResponse.Expires = 0 </P><P>' Definieren Sie Variablen und Objekte. dim ado_streamdim xml_domdim xml_datadim str_filenamedim bol_PartStartdim int_PartIDdim bol_PartEnd </P><P>' Stream-Objektsatz erstellen ado_stream = Server.CreateObject(ADODB.Stream)' XMLDOM-Objekt aus Anforderungsobjektsatz xml_dom = erstellen Server.CreateObject(MSXML2.DOMDocument)xml_dom.load(request)' Lesen Sie den Knoten aus, der den Binärdatensatz enthält. 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>' Öffnen Sie das Stream-Objekt und speichern Sie die Daten darin. ado_stream.Type = 1 ' 1=adTypeBinary ado_stream.open Wenn nicht bol_PartStart, dann ado_stream.LoadFromFile(server.mappath(.) &/& + str_filename) ' Lesen Sie die Datei ado_stream.position = ado_stream.sizeend ifado_stream.Write xml_data.nodeTypedValue' Datei speichern ado_stream.SaveToFile server.mappath(.) &/& str_filename,2'Datei speichern 2=adSaveCreateOverWrite ado_stream.close </P><P> „Ressourcen freigeben set ado_stream = Nothing set xml_dom = Nothing“ Informationen an den Browser zurücksenden Response.Write Upload erfolgreich!& str_filename & int_PartID & bol_PartStart%> </P><P>