Idéia de escrita: Codifique o arquivo local com base64 no cliente e depois envie-o para o destino.
Durante o teste, o arquivo carregado era muito grande, causando tempo limite e falha.
Posteriormente, foi melhorado. A codificação foi enviada em segmentos. O teste de 20M foi bem-sucedido.
Objetivo da escrita: Na solução tradicional, você pode selecionar e fazer upload de um de cada vez. No entanto, é mais problemático quando se trata de ler os caminhos dos arquivos no banco de dados e enviar esses arquivos para um local.
É claro que é possível usar o FTP para encontrar os caminhos um por um, mas será mais demorado encontrar esses arquivos sempre. O objetivo de escrever isso aqui é principalmente obter arquivos por meio do caminho do arquivo no banco de dados e fazer upload dos arquivos para um local em lotes por vez.
O objetivo principal é treinar-se.
Processo de solução: No início, tentei usar a entrada simulada do teclado para atribuir valores à força ao controle de arquivo e carregá-lo usando o método tradicional. Mas sempre encontro valores nulos e até muitos arquivos não são enviados. Depois de consultar algumas informações, agora estou buscando todos os caminhos do banco de dados e gravando-os em um js. Em seguida, use js na recepção para ler esses caminhos e enviar o arquivo via xmlhttp.
Como o Internet Explorer não gosta muito de xmlHttp e sempre pensa que ele tem comportamento malicioso, ele sempre dá avisos. Portanto, você não pode usar o caminho da web durante a operação. Você só pode usar o caminho físico para acessá-lo.
Então o servidor tem um arquivo para receber essas codificações e decodificá-las. Então eu chamo isso de ^_^.
Atualmente, muitos códigos ainda estão sendo aprimorados.
Uma breve introdução:
-------------------------------------------------- ----------
aryFiles.push(c://aaa.zip);
aryFiles.push(c://bbb.exe);
Aqui está o caminho do arquivo e o arquivo. Pode ser vários.
Futuramente, esse caminho também poderá ser obtido no cliente através do controle de arquivos.
http://www.xxx.com/xxx/xxx.asp
Este é o destino, você pode alterá-lo para o endereço que desejar.
ado_stream.LoadFromFile(server.mappath(.) &/& + str_filename)
server.mappath(.) &/& + str_filename Aqui está o arquivo para ler.
server.mappath(.) &/& O caminho é consistente com o caminho de armazenamento
ado_stream.SaveToFile server.mappath(.) &/& str_filename,2
server.mappath(.) &/& Este é o caminho para armazenar o arquivo. str_filename é o nome do arquivo.
A leitura e o armazenamento aqui são colocados no diretório onde o programa está colocado. Você também pode mantê-lo assim durante o teste.
Coloque o primeiro trecho de código localmente (por exemplo: c:/upload.htm)
Coloque o segundo trecho de código no servidor, que pode ser um servidor local ou público. Mantenha-o consistente com o destino acima.
(por exemplo: http://www.xxx.com/upload.asp ou http://localhost/www/upload.asp)
-------------------------------------------------- ---------------
Ação: Descubra onde o primeiro trecho de código foi salvo. Basta executá-lo (por exemplo: abra a unidade C e execute upload.htm)
Código do cliente</P><P><html><head></head><body> <input type=button onclick=BeginSendFiles() value=Send/> <input type=button onclick=JavaScript: Breaked= true ; valor=interrupção/> <div id=ddd largura=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)) Se ThisCharCode <&H80 Então 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 linguagem=javascript> var xmlhttp; var ado_stream; mPartID, mPartEnd; var SendCount; var BlockSize var Breaked;</P><P> BlockSize = 1024*100; P> P><P> // Inicia o envio de arquivos function BeginSendFiles() { initAryFiles(); } // Construa um array de arquivos a serem enviados function initAryFiles() { aryFiles.push(c://aaa.zip) ; zip c ://bbb.exe arquivo local aryFiles.reverse() ;//Nome do arquivo}</P><P> function SendFile(vFullPath) { // O arquivo vazio não será carregado se (!vFullPath) { return ;} Breaked = false ; ado_stream.Open(); ); // Leia o arquivo ado_stream.position = 0;</P><P> SendCount = Math.ceil(ado_stream.size/BlockSize) ; // Se houver resto, envie mais uma vez</P><P> // alert(SendCount) ;</P><P> var reg = //b /w+./w+$/gi mFileName = reg.exec(vFullPath) ; mPartStart = true ; mPartEnd = false ; { if (SendCount > 0) { var dom = new ActiveXObject(msxml2.DOMDocument); // Envia o arquivo xml dom.async = false; nó = dom.createProcessingInstruction(xml,versão='1.0'); Construa o nó raiz var root = dom.createElement(root); dom.documentElement.setAttribute(xmlns:dt, urn:schemas-microsoft-com:datatypes); nó de dados binários = dom.createElement(upData); node.dataType = bin.base64; codificação base64 var att = dom.createAttribute(FileName); // Atributo de nome do arquivo att.value = mFileName; // Marca de início da seção att; .value = mPartStart; node.setAttributeNode(att); Número da seção att.value = mPartID; node.setAttributeNode(att); var att = dom.createAttribute(PartEnd); ;</P><P> root.appendChild(node) ; node.nodeTypedValue = ado_stream.Read(BlockSize); Os dados do nó são lidos do fluxo, nó de comprimento fixo = null; xmlhttp = new ActiveXObject(Microsoft.XMLHTTP). false); //http://www.xxx.com/xxx/xxx.asp é o arquivo no caminho da web xmlhttp.onreadystatechange= CallBack; = null ; else { ado_stream.Close(); ado_stream = null } } function CallBack() { // Upload bem-sucedido if(xmlhttp.readystate == 4) { // Verifique se o upload foi interrompido if(Breaked) { return ; }</P><P> if (SendCount > 0) { mPartID += 1; xmlhttp.ResponseText) ; var p = Math.floor((mPartID/(Math.ceil(ado_stream.size/BlockSize) + 1)) * 100) ; // Calcula a porcentagem de progressoShowBar(p) ; );, 1) ; } else { // Transferência de arquivo concluída //div_message.innerHTML += mFileName + Transferência concluída! ;</P><P> // Continua a passar o próximo arquivo ShowBar(0) ; var cFile = aryFiles.pop() ; P > function ShowBar(per) { // Barra de progresso ddd.innerHTML = <table width='200' border=0 cellpadding='0' cellpacing='0' ><tr><td bgcolor='#6699FF'><input type=button style=' largura: + por + %> </td></tr; </tabela> }</P><P></script></html></P><P>
lado do servidor
</P><P><%@ LANGUAGE=VBScript%><% Option ExplicitResponse.Expires = 0 </P><P>' Define variáveis e objetos. dim ado_streamdim xml_domdim xml_datadim str_filenamedim bol_PartStartdim int_PartIDdim bol_PartEnd </P><P>' Criar conjunto de objetos de fluxo ado_stream = Server.CreateObject(ADODB.Stream)' Criar objeto XMLDOM a partir do conjunto de objetos de solicitação xml_dom = Server.CreateObject(MSXML2.DOMDocument)xml_dom.load(request)' Leia o nó que contém o conjunto de dados binários 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 o objeto Stream e armazene os dados nele ado_stream.Type = 1 ' 1=adTypeBinary ado_stream.open se não for bol_PartStart então ado_stream.LoadFromFile(server.mappath(.) &/& + str_filename) ' Leia o arquivo ado_stream.position = ado_stream.sizeend ifado_stream.Write xml_data.nodeTypedValue' Arquivo save ado_stream.SaveToFile server.mappath(.) &/& str_filename,2'Save file 2=adSaveCreateOverWrite ado_stream.close </P><P> 'Liberar recursos definidos ado_stream = Nada definido xml_dom = Nada' Retorne informações ao navegador Response.Write Upload bem-sucedido!& str_filename & int_PartID & bol_PartStart%> </P><P>