Visão geral
Este artigo explica um exemplo de uso da tecnologia XML para fazer upload de arquivos. Este método não tem as limitações dos métodos tradicionais. Este exemplo descreve como usar MSXML3.0 e o objeto ADO Stream para implementar esse novo método de upload. Há muitos benefícios, como a não necessidade de um componente de upload dedicado.
introdução
Para obter a função de upload em páginas HTML, podemos usar o seguinte formato de FORM no cliente:
<FORM NAME="myForm"
ACTION="TargetURL.asp"
ENCTYPE="multipart/form-data"
MÉTODO="postagem">
<INPUT TYPE="arquivo" NAME="meuArquivo">
<INPUT TYPE="submit" VALUE="Carregar arquivo">
</FORM>
Esta solução tem muitas limitações no uso do cliente e do servidor. Primeiro, temos que usar o método POST porque o método GET não pode lidar com esses dados de formulário. Além disso, não há como acionar uma ação POST sem usar um formulário. Depois de enviar os dados para o manipulador de formulário, o navegador carregará o manipulador como uma nova página e o usuário verá uma transição de página desagradável.
O atributo ENCTYPE define o método de codificação MIME para o formulário. O atributo ENCTYPE do formulário para upload de arquivos deve usar "multipart/form-data". Definir este atributo como "multipart/form-data" cria um buffer POST (estrutura composta) diferente da estrutura tradicional do objeto Request do ASP que não pode acessar esse conteúdo do formulário. Portanto, podemos usar o método Request.binaryRead para acessar esses dados, mas não podemos fazer isso usando uma linguagem de script. O método Request.binaryRead retorna dados do tipo VTaray (uma matriz do tipo Variant contendo apenas caracteres não assinados de um byte). Mas as linguagens de script só podem lidar com dados variantes. Para resolver esse problema, você só pode usar componentes de upload ASP dedicados ou extensões ISAPI, como CPSHOST.DLL. Esta é uma limitação de design.
O novo plano de upload
precisa seguir as etapas a seguir.
Cliente:
para
conteúdo binário. Use o objeto ADO Stream para colocar os dados do arquivo carregado no nó.
lado:
Leia o documento XML do objeto Request, leia os dados no nó binário e armazene-os em um arquivo no servidor. Claro, também podemos armazená-lo em um campo BLOB no banco de dados.
Antes de explicar este código, podemos pensar um pouco sobre esta solução.
Reflexões sobre XML
O formato XML suporta muitos tipos de dados, como numérico, flutuante, caractere, etc. Muitos autores definem XML como formato ASCII, mas não podemos ignorar que a tecnologia XML também pode usar o tipo de dados “bin.base64” para descrever informações binárias. Este recurso é totalmente suportado no analisador MS XML3.0, mas atualmente requer algumas configurações especiais. Este objeto fornece algumas propriedades que permitem controle total sobre os dados binários:
obj_node.dataType - Esta propriedade de leitura e gravação define o tipo de dados de um nó específico. O analisador MSXML oferece suporte a mais tipos de dados (consulte MSDN: http://msdn.microsoft.com/library/psdk/xmlsdk/xmls3z1v.htm )
Para dados binários podemos usar o tipo "bin.base64".
obj_node.nodeTypedValue – Esta propriedade de leitura e gravação contém dados que representam o nó especificado em termos do tipo especificado.
Podemos criar um documento XML contendo vários nós do tipo bin.base64, que contêm arquivos carregados. Este recurso permite fazer upload de vários arquivos de uma vez usando um POST.
Podemos usar o objeto XMLHttpRequest e o método POST para enviar um documento XML ao servidor Web. Este objeto fornece suporte de protocolo do lado do cliente para o servidor HTTP, permitindo que objetos MS XMLDOM sejam enviados e recebidos no servidor web. XMLHttpRequest é um objeto COM integrado no Internet Explorer 5 (não é necessária instalação personalizada) e não há necessidade de converter a página após o envio.
Pensando no objeto ADO Stream
Podemos criar um documento XML contendo um ou mais nós binários no lado do cliente. Também temos que preencher o nó com o conteúdo do arquivo. Infelizmente, as linguagens de script não podem acessar o sistema de arquivos local, e o objeto Scripting.FileSystem (um objeto integrado do sistema Win32) não conseguiu acessar arquivos binários até agora. Esta é uma limitação de design. Portanto, precisamos encontrar outro objeto COM que possa fornecer acesso aos binários locais.
O objeto ADO Stream (componente no MDAC 2.5) fornece os meios para ler, gravar e gerenciar dados de fluxo binário. O conteúdo do fluxo de bytes pode ser texto ou dados binários e não há limite de capacidade. No ADO 2.5, a introdução do objeto Stream pela Microsoft não pertence a nenhuma camada da estrutura do objeto ADO, portanto, podemos usar o objeto sem empacotamento.
Neste artigo, o objeto Stream é usado para acessar o conteúdo do arquivo e, em seguida, o conteúdo é armazenado no nó XML.
no lado do cliente
usa objetos Stream e MSXML para concluir a ação de upload de arquivo.
<HTML>
<HEAD><TITLE>Envio de arquivo</TITLE></HEAD>
<CORPO>
<INPUT id=btn_send name="btn_send" type=button value="ARQUIVO ENVIAR">
<DIV id=div_message>Pronto</DIV>
</BODY>
</HTML>
<SCRIPT LANGUAGE=javascript>
// Função de upload
função btn_send.onclick()
{
//Cria objeto de fluxo ADO
var ado_stream = new ActiveXObject("ADODB.Stream");
// Cria um documento XML contendo informações de cabeçalho padrão e nó raiz
var xml_dom = novo ActiveXObject("MSXML2.DOMDocument");
xml_dom.loadXML('<?xml version="1.0" ?> <root/>');
//Especifica o tipo de dados
xml_dom.documentElement.setAttribute("xmlns:dt", "urn:schemas-microsoft-com:datatypes");
// Crie um novo nó e defina-o como um nó de dados binários
var l_node1 = xml_dom.createElement("arquivo1");
l_node1.dataType = "bin.base64";
//Abra o objeto Stream e leia o arquivo fonte
ado_stream.Type = 1; // 1=adTypeBinary
ado_stream.Open();
ado_stream.LoadFromFile("c:\tmp\meuarquivo.doc");
//Salva o conteúdo do arquivo no nó XML
l_node1.nodeTypedValue = ado_stream.Read(-1);
ado_stream.Close();
xml_dom.documentElement.appendChild(l_node1);
// Você pode criar vários nós binários e fazer upload de vários arquivos de uma vez
// Envia o documento XML para o servidor Web
var xmlhttp = novo ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("POST","./file_recieve.asp",false);
xmlhttp.send(xml_dom);
//Exibe as informações retornadas pelo servidor
div_message.innerHTML=xmlhttp.ResponseText;
}
</SCRIPT>
no lado do servidor
usa o mesmo objeto para fornecer funcionalidade de processamento de upload no lado do servidor.
<%@LANGUAGE=VBScript%>
<% Opção Explícita
Response.Expires = 0
' Define variáveis e objetos.
escurecer ado_stream
dimxml_dom
dim xml_file1
'Criar objeto Stream
definir ado_stream = Server.CreateObject("ADODB.Stream")
'Cria um objeto XMLDOM a partir do objeto Request
definir xml_dom = Server.CreateObject("MSXML2.DOMDocument")
xml_dom.load(solicitação)
'Lê nós contendo dados binários
set xml_file1 = xml_dom.selectSingleNode("root/file1")
'Abra o objeto Stream e armazene os dados nele
ado_stream.Type = 1 ' 1=adTypeBinary
ado_stream.open
ado_stream.Write xml_file1.nodeTypedValue
'Arquivo salvo
ado_stream.SaveToFile "c:tmpupload1.doc",2 ' 2=adSaveCreateOverWrite
ado_stream.close
'Destruir objeto
definir ado_stream = Nada
definir xml_dom = Nada
'Retorna informações para o navegador
Response.Write "Upload bem-sucedido!"
%>
Você também pode usar o objeto Stream para colocar dados no campo BLOB do banco de dados.
A vantagem de usar esse método é que
ele não causa conversões de página.
Não são necessários componentes especiais.
Vários arquivos podem ser carregados ao mesmo tempo.
Este programa é escrito em script puro e pode ser facilmente inserido em outros códigos sem a cooperação de quaisquer objetos HTML. Esta lógica também pode ser implementada em qualquer linguagem que suporte o padrão COM.
Considerações de segurança do sistema:
Este método só pode ser usado em redes internas porque requer que o nível de segurança do IE5 seja definido como “baixo”. Obrigatório:
Permitir scripts e objetos ActiveX. Esta configuração permite que o navegador execute instruções JScript como "myobj = new activexobject(...)";
O acesso entre domínios à fonte de dados deve ser permitido. Esta configuração permite o uso de objetos Stream no lado do cliente. O MS XML DOM 3.0 e o MDAC 2.5 também devem ser instalados no servidor e no cliente.