Descripción general
Este artículo explica un ejemplo del uso de la tecnología XML para cargar archivos. Este método no tiene las limitaciones de los métodos tradicionales. Este ejemplo describe cómo utilizar MSXML3.0 y el objeto ADO Stream para implementar este nuevo método de carga. Hay muchos beneficios, como que no es necesario un componente de carga dedicado.
introducción
Para obtener la función de carga en páginas web HTML, podemos utilizar el siguiente formato de FORM en el cliente:
<FORM NAME="myForm"
ACCIÓN="URLDestino.asp"
ENCTYPE="multiparte/datos-formulario"
MÉTODO="publicar">
<TIPO DE ENTRADA="archivo" NOMBRE="miArchivo">
<INPUT TYPE="enviar" VALUE="Subir archivo">
</FORM>
Esta solución tiene muchas limitaciones en el uso tanto del cliente como del servidor. Primero, tenemos que usar el método POST porque el método GET no puede manejar dichos datos del formulario. Además, no hay forma de activar una acción POST sin utilizar un formulario. Después de enviar los datos al controlador de formulario, el navegador cargará el controlador como una página nueva y el usuario verá una transición de página desagradable.
El atributo ENCTYPE define el método de codificación MIME para el formulario. El atributo ENCTYPE del formulario para cargar archivos debe usar "multipart/form-data". Establecer este atributo en "multipart/form-data" crea un búfer POST (estructura compuesta) que es diferente de la estructura tradicional. El objeto Request de ASP no puede acceder a dicho contenido del formulario. Entonces, podemos usar el método Request.binaryRead para acceder a estos datos, pero no podemos hacerlo usando un lenguaje de secuencias de comandos. El método Request.binaryRead devuelve datos de tipo VTaray (una matriz de tipo Variant que contiene solo caracteres de un byte sin signo). Pero los lenguajes de secuencias de comandos solo pueden manejar datos variantes. Para resolver este problema, sólo puede utilizar componentes de carga ASP dedicados o extensiones ISAPI, como CPSHOST.DLL. Esta es una limitación de diseño.
El nuevo plan de carga
debe seguir los siguientes pasos.
Cliente:
utilice MSXML 3.0 para crear un documento XML. Cree un nodo XML para contenido binario. Utilice el objeto ADO Stream para colocar los datos del archivo cargado en el nodo. Utilice el objeto XMLHTTP para enviar el documento XML al servidor web
. lado:
Lea el documento XML del objeto Solicitud, lea los datos en el nodo binario y guárdelos en un archivo en el servidor. Por supuesto, también podemos almacenarlo en un campo BLOB de la base de datos.
Antes de explicar este código, podemos pensar un poco en esta solución.
Pensamientos sobre XML
El formato XML admite muchos tipos de datos, como numéricos, flotantes, de caracteres, etc. Muchos autores definen XML como formato ASCII, pero no podemos ignorar que la tecnología XML también puede utilizar el tipo de datos "bin.base64" para describir información binaria. Esta característica es totalmente compatible con el analizador MS XML3.0, pero actualmente requiere algunas configuraciones especiales. Este objeto proporciona algunas propiedades que permiten un control total sobre los datos binarios:
obj_node.dataType: esta propiedad de lectura y escritura define el tipo de datos de un nodo específico. El analizador MSXML admite más tipos de datos (consulte MSDN: http://msdn.microsoft.com/library/psdk/xmlsdk/xmls3z1v.htm )
Para datos binarios podemos utilizar el tipo "bin.base64".
obj_node.nodeTypedValue: esta propiedad de lectura y escritura contiene datos que representan el nodo especificado en términos del tipo especificado.
Podemos crear un documento XML que contenga múltiples nodos de tipo bin.base64, que contienen archivos cargados. Esta función le permite cargar varios archivos a la vez usando una POST.
Podemos utilizar el objeto XMLHttpRequest y el método POST para enviar un documento XML al servidor web. Este objeto proporciona soporte de protocolo del lado del cliente al servidor HTTP, lo que permite enviar y recibir objetos MS XMLDOM en el servidor web. XMLHttpRequest es un objeto COM integrado en Internet Explorer 5 (no requiere instalación personalizada) y no es necesario convertir la página después del envío.
Pensando en el objeto ADO Stream,
podemos crear un documento XML que contenga uno o más nodos binarios en el lado del cliente. También tenemos que llenar el nodo con el contenido del archivo. Desafortunadamente, los lenguajes de secuencias de comandos no pueden acceder al sistema de archivos local y el objeto Scripting.FileSystem (un objeto integrado en el sistema Win32) no ha podido acceder a los archivos binarios hasta ahora. Esta es una limitación de diseño. Entonces necesitamos encontrar otro objeto COM que pueda proporcionar acceso a los binarios locales.
El objeto ADO Stream (componente de MDAC 2.5) proporciona los medios para leer, escribir y administrar datos de flujo binario. El contenido del flujo de bytes puede ser texto o datos binarios y no hay límite de capacidad. En ADO 2.5, la introducción del objeto Stream por parte de Microsoft no pertenece a ninguna capa de la estructura del objeto ADO, por lo que podemos usar el objeto sin agruparlo.
En este artículo, el objeto Stream se utiliza para acceder al contenido del archivo y luego el contenido se almacena en el nodo XML.
en el lado del cliente
utiliza objetos Stream y MSXML para completar la acción de carga del archivo.
<HTML>
<HEAD><TITLE>Enviar archivo</TITLE></HEAD>
<CUERPO>
<ENTRADA id=btn_send nombre="btn_send" tipo=valor del botón="ENVIAR ARCHIVO">
<DIV id=div_message>Listo</DIV>
</CUERPO>
</HTML>
<SCRIPT LANGUAGE=javascript>
// Función de carga
función btn_send.onclick()
{
//Crear objeto ADO-stream
var ado_stream = new ActiveXObject("ADODB.Stream");
// Crea un documento XML que contiene información de encabezado predeterminada y nodo raíz
var xml_dom = nuevo ActiveXObject("MSXML2.DOMDocument");
xml_dom.loadXML('<?xml version="1.0" ?> <root/>');
//Especificar tipo de datos
xml_dom.documentElement.setAttribute("xmlns:dt", "urn:schemas-microsoft-com:datatypes");
// Crea un nuevo nodo y configúrelo como un nodo de datos binarios.
var l_node1 = xml_dom.createElement("archivo1");
l_node1.dataType = "bin.base64";
//Abre el objeto Stream y lee el archivo fuente
ado_stream.Type = 1; // 1=tipo de anuncioBinario
ado_stream.Open();
ado_stream.LoadFromFile("c:\tmp\myfile.doc");
//Guardar el contenido del archivo en el nodo XML
l_node1.nodeTypedValue = ado_stream.Read(-1); // -1=adReadAll
ado_stream.Close();
xml_dom.documentElement.appendChild(l_node1);
// Puede crear varios nodos binarios y cargar varios archivos a la vez
// Enviar el documento XML al servidor web
var xmlhttp = nuevo ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("POST","./file_recieve.asp",false);
xmlhttp.send(xml_dom);
// Muestra la información devuelta por el servidor.
div_message.innerHTML = xmlhttp.ResponseText;
}
</SCRIPT>
en el lado del servidor
utiliza el mismo objeto para proporcionar la funcionalidad de procesamiento de carga en el lado del servidor.
<%@ IDIOMA=VBScript%>
<% Opción explícita
Response.Expires = 0
'Define variables y objetos.
tenue ado_stream
dimxml_dom
dim xml_file1
'Crear objeto Stream
establecer ado_stream = Server.CreateObject("ADODB.Stream")
' Crea un objeto XMLDOM a partir del objeto Solicitud
establecer xml_dom = Server.CreateObject ("MSXML2.DOMDocument")
xml_dom.load(solicitud)
'Leer nodos que contienen datos binarios
set xml_file1 = xml_dom.selectSingleNode("root/file1")
'Abre el objeto Stream y almacena los datos en él
ado_stream.Type = 1 ' 1=adTypeBinary
ado_stream.abierto
ado_stream.Escribir xml_file1.nodeTypedValue
'Guardar archivo
ado_stream.SaveToFile "c:tmpupload1.doc",2 ' 2=adSaveCreateOverWrite
ado_stream.close
' Destruir objeto
establecer ado_stream = Nada
establecer xml_dom = Nada
'Devolver información al navegador
Respuesta.Escribe "¡Carga exitosa!"
%>
También puede utilizar el objeto Stream para colocar datos en el campo BLOB de la base de datos.
El beneficio de utilizar este método es que
no genera conversiones de página.
No se requieren componentes especiales.
Se pueden cargar varios archivos al mismo tiempo.
Este programa está escrito en script puro y se puede insertar fácilmente en otros códigos sin la cooperación de ningún objeto HTML. Esta lógica también se puede implementar en cualquier lenguaje que admita el estándar COM.
Consideraciones de seguridad del sistema:
este método solo se puede utilizar en redes internas porque requiere que el nivel de seguridad de IE5 esté configurado en "bajo". Obligatorio:
Permitir scripts y objetos ActiveX. Esta configuración permite que el navegador ejecute declaraciones JScript como "myobj = new activexobject(...)";
Se debe permitir el acceso entre dominios a la fuente de datos. Esta configuración permite el uso de objetos Stream en el lado del cliente. MS XML DOM 3.0 y MDAC 2.5 también deben estar instalados tanto en el servidor como en el cliente.