Idée d'écriture : Encoder le fichier local en base64 sur le client puis l'envoyer vers la destination.
Pendant le test, le fichier téléchargé était trop volumineux, provoquant un délai d'attente et un échec.
Plus tard, il a été amélioré. L'encodage a été envoyé par segments. Le test de 20M a réussi.
Objectif de l'écriture : dans la solution traditionnelle, vous pouvez en sélectionner et en télécharger un à la fois. Cependant, cela est plus difficile lorsqu'il s'agit de lire les chemins de fichiers dans la base de données et de télécharger ces fichiers au même endroit.
Il est bien sûr possible d'utiliser ftp pour retrouver les chemins un à un, mais il me faudra à chaque fois plus de temps pour retrouver ces fichiers. Le but d'écrire ceci ici est principalement d'obtenir des fichiers via le chemin du fichier dans la base de données et de télécharger les fichiers à un endroit par lots à la fois.
Le but principal est de vous former.
Processus de solution : au début, j'ai essayé d'utiliser une saisie clavier simulée pour attribuer de force des valeurs au contrôle de fichier et le télécharger en utilisant la méthode traditionnelle. Mais je rencontre toujours des valeurs nulles et même de nombreux fichiers ne sont pas envoyés. Après avoir consulté quelques informations, je récupère maintenant tous les chemins dans la base de données et les écris dans un js. Utilisez ensuite js à la réception pour lire ces chemins et envoyer le fichier via xmlhttp.
Parce qu'Internet Explorer n'aime pas beaucoup xmlHttp et pense toujours qu'il a un comportement malveillant, il donne donc toujours des avertissements. Par conséquent, vous ne pouvez pas utiliser le chemin Web pendant le fonctionnement. Vous ne pouvez utiliser que le chemin physique pour y accéder.
Ensuite, le serveur dispose d'un fichier pour recevoir ces encodages et les décoder. Je l'appelle donc c/s ^_^.
À l’heure actuelle, de nombreux codes sont encore en cours d’amélioration.
Une brève introduction:
-------------------------------------------------- ----------
aryFiles.push(c://aaa.zip);
aryFiles.push(c://bbb.exe);
Voici le chemin du fichier et le fichier. Il peut être multiple.
À l'avenir, ce chemin pourra également être obtenu sur le client via le contrôle de fichiers.
http://www.xxx.com/xxx/xxx.asp
C'est la destination, vous pouvez la remplacer par l'adresse que vous souhaitez.
ado_stream.LoadFromFile(server.mappath(.) &/& + str_filename)
server.mappath(.) &/& + str_filename Voici le fichier à lire.
server.mappath(.) &/& Le chemin est cohérent avec le chemin de stockage
ado_stream.SaveToFile server.mappath(.) &/& str_filename,2
server.mappath(.) &/& Ceci est le chemin pour stocker le fichier str_filename est le nom du fichier.
La lecture et le stockage ici sont placés dans le répertoire où est placé le programme. Vous pouvez également le conserver ainsi lors des tests.
Mettez le premier morceau de code localement (par exemple:c:/upload.htm)
Placez le deuxième morceau de code sur le serveur, qui peut être un serveur local ou un serveur public. Gardez-le cohérent avec la destination ci-dessus.
(par exemple : http://www.xxx.com/upload.asp ou http://localhost/www/upload.asp)
-------------------------------------------------- ---------------
Action : Recherchez l'emplacement où le premier morceau de code est enregistré. Exécutez-le simplement (par exemple : ouvrez le lecteur C et exécutez upload.htm)
Code client</P><P><html><head></head><body> <input type=button onclick=BeginSendFiles(); value=Send/> <input type=button onclick=JavaScript: Breaked= true ; value=interruption/> <div id=ddd width=300px></div> </br> <DIV id=div_message></DIV></body></P><P><script langage=VBScript>Fonction bytes2BSTR(vIn) strReturn = For i = 1 To LenB(vIn) ThisCharCode = AscB(MidB(vIn,i ,1)) Si ThisCharCode < &H80 Alors 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 langage=javascript> var xmlhttp; var ado_stream; var mFileName, mPartStart, mPartID, mPartEnd; var SendCount; var BlockSize; var Breaked; var aryFiles;</P><P> BlockSize = 1024*100; //Le nombre d'octets envoyés à chaque foisBreaked = false; P> P><P> // Commencer à envoyer des fichiers function BeginSendFiles() { initAryFiles(); } // Construire un tableau de fichiers à envoyer function initAryFiles() { aryFiles.push(c://aaa.zip) ; aryFiles.push(c://bbb.exe) ;//c://aaa. zip c ://bbb.exe fichier local aryFiles.reverse() ;//Nom du fichier}</P><P> function SendFile(vFullPath) { // Le fichier vide ne sera pas téléchargé si (!vFullPath) { return ; } Breaked = false ; div_message.innerHTML = ; ado_stream = new ActiveXObject(ADODB.Stream); // Lire le flux de fichiers ado_stream.Type = 1; ); // Lire le fichier ado_stream.position = 0;</P><P> SendCount = Math.ceil(ado_stream.size/BlockSize) ; // S'il y a un reste, envoyer une fois de plus</P><P> // alert(SendCount) ;</P><P> var reg = //b /w+ /w+$/gi mFileName = reg.exec(vFullPath) ; mPartStart = true ; mPartEnd = false SendData() ; { if (SendCount > 0) { var dom = new ActiveXObject(msxml2.DOMDocument); // Envoyer le fichier XML dom.async = false; dom.resolveExternals = false;</P><P> // Construire l'en-tête du fichier XML var node = dom.createProcessingInstruction(xml,version='1.0'); dom.appendChild(node); Construisez le nœud racine var root = dom.createElement(root); dom.appendChild(root); dom.documentElement.setAttribute(xmlns:dt, urn:schemas-microsoft-com:datatypes); nœud de données binaires = dom.createElement(upData); node.dataType = bin.base64; encodage base64 var att = dom.createAttribute(FileName); // Attribut de nom de fichier att.value = mFileName; node.setAttributeNode(att); var att = dom.createAttribute(PartStart); .value = mPartStart; node.setAttributeNode(att); att = null; var att = dom.createAttribute(PartID); Numéro de section att.value = mPartID; node.setAttributeNode(att); var att = dom.createAttribute(PartEnd); // Marque de fin de section att.value = mPartEnd; ;</P><P> root.appendChild(node) ; node.nodeTypedValue = ado_stream.Read(BlockSize); Les données du nœud sont lues à partir du flux, nœud de longueur fixe = null ; xmlhttp = new ActiveXObject(Microsoft.XMLHTTP.open(POST,http://www.xxx.com/xxx/xxx.asp), false); //http://www.xxx.com/xxx/xxx.asp est le fichier sur le chemin Web xmlhttp.onreadystatechange= CallBack; xmlhttp.send(dom); = null ; } else { ado_stream.Close(); ado_stream = null ; } } function CallBack() { // Téléchargement réussi if(xmlhttp.readystate == 4) { // Vérifiez si le téléchargement est interrompu if(Breaked) { 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) ; // Calculer le pourcentage de progressionShowBar(p) ; );, 1) ; else } // Transfert de fichier terminé //div_message.innerHTML += mFileName + Transfert terminé ! ;</P><P> // Continuer à transmettre le fichier suivant ShowBar(0) ; var cFile = aryFiles.pop() ; SendFile(cFile) } } </P><P> }</P>< P > function ShowBar(per) { // Barre de progression ddd.innerHTML = <table width='200' border=0 cellpadding='0' Cellpacing='0' ><tr><td bgcolor='#6699FF'><input type=button style=' width: + per + % ; border:0px; background:#005599; color:#FFFFFF' value= + per + %> </td></tr ></table> ; }</P><P></script></html></P><P>
côté serveur
</P><P><%@ LANGUAGE=VBScript%><% Option ExplicitResponse.Expires = 0 </P><P>' Définir des variables et des objets. dim ado_streamdim xml_domdim xml_datadim str_filenamedim bol_PartStartdim int_PartIDdim bol_PartEnd </P><P>' Créer un ensemble d'objets Stream ado_stream = Server.CreateObject(ADODB.Stream)' Créer un objet XMLDOM à partir de l'ensemble d'objets Request xml_dom = Server.CreateObject(MSXML2.DOMDocument)xml_dom.load(request)' Lire le nœud contenant l'ensemble de données binaires 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>' Ouvrez l'objet Stream et stockez-y les données ado_stream.Type = 1 ' 1=adTypeBinary ado_stream.open sinon bol_PartStart alors ado_stream.LoadFromFile(server.mappath(.) &/& + str_filename) ' Lire le fichier ado_stream.position = ado_stream.sizeend ifado_stream.Write xml_data.nodeTypedValue' File save ado_stream.SaveToFile server.mappath(.) &/& str_filename,2'Save file 2=adSaveCreateOverWrite ado_stream.close </P><P> 'Ressources de libération définies ado_stream = Rien définies xml_dom = Rien' Renvoie les informations au navigateur Response.Write Upload réussi !& str_filename & int_PartID & bol_PartStart%> </P><P>