Idea de escritura: Codifique el archivo local con base64 en el cliente y luego envíelo al destino.
Durante la prueba, el archivo cargado era demasiado grande, lo que provocó un tiempo de espera y una falla.
Posteriormente se mejoró. La codificación se envió en segmentos. La prueba de 20M fue exitosa.
Propósito de la escritura: en la solución tradicional, puede seleccionar y cargar uno a la vez, sin embargo, es más problemático cuando se trata de leer las rutas de los archivos en la base de datos y cargar estos archivos en un solo lugar.
Por supuesto, es posible utilizar ftp para encontrar las rutas una por una, pero cada vez me llevará más tiempo encontrar estos archivos. El propósito de escribir esto aquí es principalmente obtener archivos a través de la ruta del archivo en la base de datos y cargar archivos en un lugar en lotes a la vez.
El objetivo principal es entrenarte a ti mismo.
Proceso de solución: al principio, intenté utilizar la entrada de teclado simulada para asignar valores a la fuerza al control de archivos y cargarlos utilizando el método tradicional. Pero siempre encuentro valores nulos e incluso muchos archivos no se envían. Después de consultar cierta información, ahora busco todas las rutas a través de la base de datos y las escribo en un js. Luego use js en la recepción para leer estas rutas y enviar el archivo a través de xmlhttp.
Debido a que a Internet Explorer no le gusta mucho xmlHttp y siempre piensa que tiene un comportamiento malicioso, siempre da advertencias. Por lo tanto, no puede usar la ruta web durante la operación. Solo puede usar la ruta física para acceder.
Luego el servidor tiene un archivo para recibir estas codificaciones y decodificarlas. Entonces lo llamo c/s.
En la actualidad, todavía se están mejorando muchos códigos.
Una breve introducción:
-------------------------------------------------- ----------
aryFiles.push(c://aaa.zip);
aryFiles.push(c://bbb.exe);
Aquí está la ruta del archivo y el archivo. Puede ser múltiple.
En el futuro, esta ruta también se podrá obtener en el cliente a través del control de archivos.
http://www.xxx.com/xxx/xxx.asp
Este es el destino, puedes cambiarlo a la dirección que desees.
ado_stream.LoadFromFile(servidor.mappath(.) &/& + str_filename)
server.mappath(.) &/& + str_filename Aquí está el archivo para leer.
server.mappath(.) &/& La ruta es coherente con la ruta de almacenamiento
ado_stream.SaveToFile server.mappath(.) &/& str_filename,2
server.mappath(.) &/& Esta es la ruta para almacenar el archivo str_filename es el nombre del archivo.
La lectura y el almacenamiento aquí se colocan en el directorio donde se encuentra el programa. También puede mantenerlo así durante la prueba.
Coloque el primer fragmento de código localmente (por ejemplo:c:/upload.htm)
Coloque el segundo fragmento de código en el servidor, que puede ser un servidor local o un servidor público. Manténgalo coherente con el destino anterior.
(por ejemplo: http://www.xxx.com/upload.asp o http://localhost/www/upload.asp)
-------------------------------------------------- ---------------
Acción: busque dónde se guarda el primer fragmento de código. Simplemente ejecútelo (por ejemplo: abra la unidad c y ejecute upload.htm)
Código de cliente</P><P><html><head></head><body> <tipo de entrada=botón onclick=BeginSendFiles(); valor=Enviar/> <tipo de entrada=botón onclick=JavaScript: Roto= verdadero ; valor=interrupción/> <div id=ddd ancho=300px></div></br> <DIV id=div_message></DIV></body></P><P><script language=VBScript>Función bytes2BSTR(vIn) strReturn = For i = 1 To LenB(vIn) ThisCharCode = AscB(MidB(vIn,i ,1)) Si ThisCharCode < &H80 Entonces strReturn = strReturn & Chr(ThisCharCode) De lo contrario NextCharCode = AscB(MidB(vIn,i+1,1)) strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode)) i = i + 1 Fin si los siguientes bytes2BSTR = strReturnEnd Función</script></P ><P><lenguaje de script=javascript> var xmlhttp; var ado_stream; var mFileName, mPartStart, mPartID, mPartEnd; var SendCount; var BlockSize; var Breaked; var aryFiles;</P><P> BlockSize = 1024*100; // El número de bytes enviados cada vezBreaked = false; P> P><P> // Iniciar envío de archivos function BeginSendFiles() { initAryFiles(); } // Construye una matriz de archivos para enviar function initAryFiles() { aryFiles.push(c://aaa.zip); aryFiles.push(c://bbb.exe);//c://aaa. zip c ://bbb.exe archivo local aryFiles.reverse() ;//Nombre de archivo}</P><P> function SendFile(vFullPath) { // El archivo vacío no se cargará si (!vFullPath) { return } Breaked = false ; div_message.innerHTML = ; ado_stream = new ActiveXObject(ADODB.Stream); ); // Lee el archivo ado_stream.position = 0;</P><P> SendCount = Math.ceil(ado_stream.size/BlockSize) ; // Si queda un resto, envíalo una vez más</P><P> // alert(SendCount) ;</P><P> var reg = //b /w+. /w+$/gi mFileName = reg.exec(vFullPath); mPartStart = verdadero; mPartID = 1; mPartEnd = false }</P><P> función EnviarDatos(); { if (SendCount > 0) { var dom = new ActiveXObject(msxml2.DOMDocument); // Enviar archivo xml dom.async = false; dom.resolveExternals = false;</P><P> // Construir encabezado de archivo xml var nodo = dom.createProcessingInstruction(xml,version='1.0'); dom.appendChild(nodo = null; Construya el nodo raíz var root = dom.createElement(root); dom.appendChild(root); dom.documentElement.setAttribute(xmlns:dt, urn:schemas-microsoft-com:datatypes); nodo de datos binarios = dom.createElement(upData); node.dataType = bin.base64; codificación base64 var att = dom.createAttribute(FileName); // atributo de nombre de archivo = dom.createAttribute(PartStart); // marca de inicio de sección att); .value = mPartStart; node.setAttributeNode(att); att = null; Número de sección att.value = mPartID; node.setAttributeNode(att); att = null; var att = dom.createAttribute(PartEnd); // Marca de final de sección att.value = mPartEnd; ;</P><P> root.appendChild(nodo) ; node.nodeTypedValue = ado_stream.Read(BlockSize); Los datos del nodo se leen de la secuencia, nodo de longitud fija = nulo; SendCount -= 1; xmlhttp = new ActiveXObject(Microsoft.XMLHTTP.open(POST,http://www.xxx.com/xxx/xxx.asp); false); //http://www.xxx.com/xxx/xxx.asp es el archivo en la ruta web xmlhttp.onreadystatechange= CallBack; = null } else { ado_stream.Close(); ado_stream = null ; } } function CallBack() { // Carga exitosa if(xmlhttp.readystate == 4) { // Verifica si la carga se interrumpe 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) // Calcular el porcentaje de progresoShowBar(p); var t = setTimeout(SendData ( );, 1) ; } else { // Transferencia de archivos completada //div_message.innerHTML += mFileName + ¡Transferencia completada! ;</P><P> // Continuar pasando el siguiente archivo ShowBar(0) ; var cFile = aryFiles.pop() ; SendFile(cFile) ; P > function ShowBar(per) { // Barra de progreso ddd.innerHTML = <table width='200' border=0 cellpadding='0'cellspacing='0' ><tr><td bgcolor='#6699FF'><tipo de entrada=estilo de botón=' ancho: + por + % ; borde:0px; color:#FFFFFF' valor= + por + %> </td></tr ></tabla> }</P><P></script></html></P><P>
lado del servidor
</P><P><%@ LANGUAGE=VBScript%><% Option ExplicitResponse.Expires = 0 </P><P>' Define variables y objetos. dim ado_streamdim xml_domdim xml_datadim str_filenamedim bol_PartStartdim int_PartIDdim bol_PartEnd </P><P>' Crear conjunto de objetos Stream ado_stream = Server.CreateObject(ADODB.Stream)' Crear objeto XMLDOM a partir del conjunto de objetos Request xml_dom = Server.CreateObject(MSXML2.DOMDocument)xml_dom.load(request)' Lee el nodo que contiene el conjunto de datos binarios 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>' Abra el objeto Stream y almacene los datos en él ado_stream.Type = 1 ' 1=adTypeBinary ado_stream.open si no es bol_PartStart entonces ado_stream.LoadFromFile(server.mappath(.) &/& + str_filename) ' Leer el archivo ado_stream.position = ado_stream.sizeend ifado_stream.Write xml_data.nodeTypedValue' Guardar archivo ado_stream.SaveToFile server.mappath(.) &/& str_filename,2'Guardar archivo 2=adSaveCreateOverWrite ado_stream.close </P><P> 'Liberar recursos set ado_stream = Nada set xml_dom = Nada' Devuelve información al navegador Response.Write ¡Carga exitosa!& str_filename & int_PartID & bol_PartStart%> </P><P>