Autor: Zhui Feng
ha estado usando ASP para escribir aplicaciones de sitios web durante mucho tiempo. Es inevitable que encuentre varios problemas. Entre ellos, cómo cargar archivos al servidor es probablemente el problema más común, especialmente al cargar imágenes. Si desea implementar una función de "una estrella por día" similar a la proporcionada por la comunidad virtual NetEase en su propia comunidad, debe proporcionar la función para que los internautas carguen fotos. Para cargar archivos de imágenes al servidor, puede utilizar varios componentes de carga de archivos gratuitos. Aunque son muy potentes, en muchos casos solo podemos utilizar espacio gratuito compatible con ASP o alquilar el espacio virtual de otras personas. simplemente nos resulta imposible utilizar el componente de carga de archivos; en el segundo caso, también tenemos que pagar mucho "dinero". A menos que tenga su propio host virtual, puede instalar fácilmente los componentes que necesita en el servidor. Esta situación está fuera del alcance de la mayoría de las personas. ¿Entonces no hay nada que podamos hacer? Jaja, la respuesta es sí (por supuesto que sí, de lo contrario no podría escribir este artículo). Usemos código ASP puro para implementar la función de cargar imágenes y guardarlas en la base de datos (por cierto, también implementamos la función de mostrar imágenes en la base de datos en la página web).
Primero, familiaricémonos con los métodos de objetos que usaremos. Generalmente usamos el objeto Solicitud para obtener los datos pasados de la página anterior. De manera similar, también podemos usar el objeto Request para obtener los datos del archivo cargado. El método utilizado es Request.BinaryRead(). El método que utilizamos para leer los datos de la imagen de la base de datos y mostrarlos en la página web es:
Solicitud.BinaryWrite(). Cuando obtenemos los datos de la imagen y los guardamos en la base de datos, no podemos usar directamente la instrucción Insert para operar la base de datos. En cambio, debemos usar el método AppendChunk de ADO. De manera similar, para leer los datos de la imagen en la base de datos. Método GetChunk. La sintaxis específica de cada método es la siguiente:
*Sintaxis de Request.BinaryRead:
variante = Solicitud.BinaryRead (recuento)
parámetro
variante
El valor de retorno contiene los datos leídos del cliente.
contar
Indica la cantidad de datos que se leerán del cliente. Este valor es menor o igual a la cantidad de datos obtenidos mediante el método Request.TotalBytes.
*Sintaxis de Request.BinaryWrite:
Solicitud.BinaryWritedata
parámetro
datos
El paquete que se escribirá en el navegador del cliente.
*Sintaxis de Solicitud.TotalBytes:
variante=Solicitud.TotalBytes
parámetro
variante
Devuelve el número de bytes de datos leídos del cliente.
*La sintaxis AppendChunk agrega datos a un texto grande, un campo de datos binarios o un objeto de parámetro.
objeto.AppendChunkData
parámetro
objetoCampo o objeto de parámetro
Tipo de variante de datos, que contiene datos añadidos al objeto.
Descripción Utilice el método AppendChunk del objeto Campo o Parámetro para completar datos binarios o de caracteres largos en el objeto. Cuando la memoria del sistema es limitada, puede utilizar el método AppendChunk para realizar algunas, pero no todas, las operaciones con valores enteros largos.
*La sintaxis GetChunk devuelve todo o parte del contenido de un objeto de campo de datos binarios o texto grande.
variable=campo.GetChunk(Tamaño)
El valor devuelto devuelve el tipo de variante.
parámetro
Tamaño de expresión de entero largo, igual al número de bytes o caracteres que se recuperarán.
Descripción Utilice el método GetChunk del objeto Field para recuperar algunos o todos sus datos binarios o de caracteres largos. Cuando la memoria del sistema es limitada, puede utilizar el método GetChunk para procesar algunos, pero no todos, los valores enteros largos.
Los datos devueltos por la llamada GetChunk se asignarán a la "variable". Si el tamaño es mayor que los datos restantes, entonces
GetChunk simplemente devuelve los datos restantes sin llenar la "variable" con espacios en blanco. Si el campo está vacío, entonces
El método GetChunk devuelve Nulo.
Cada llamada posterior a GetChunk recuperará datos comenzando donde terminó la llamada anterior a GetChunk. Sin embargo, si recupera datos de un campo y luego establece o lee el valor de otro campo en el registro actual, ADO asumirá que los datos se han recuperado del primer campo. Si se vuelve a llamar al método GetChunk en el primer campo, ADO interpretará la llamada como una nueva operación GetChunk y comenzará a leer desde el principio del registro. Si el otro objeto Recordset no es una copia del primer objeto Recordset, acceder a los campos que contiene no interrumpirá la operación GetChunk.
Si el bit adFldLong en la propiedad Atributos del objeto Campo está establecido en Verdadero, puede usar el método GetChunk en el campo.
Si no hay ningún registro actual cuando se utiliza el método Getchunk en un objeto de campo, se generará el error 3021 (Sin registro actual).
A continuación, vamos a diseñar nuestra base de datos. Como prueba, nuestra estructura de base de datos es la siguiente (access2000):
Nombre de campo tipo descripción id número automático valor de clave principal
El objeto img OLE se utiliza para guardar datos de imagen
Para MSSQLServer7, la estructura correspondiente es la siguiente:
Nombre de campo tipo descripción id int (identidad) valor de clave principal
La imagen img se utiliza para guardar datos de imagen.
Ahora comenzamos a escribir formalmente la parte de carga de nuestro código ASP puro. Primero, tenemos una interfaz de carga proporcionada al usuario, que le permite seleccionar la imagen a cargar. El código es el siguiente (upload.htm):
<html>
<cuerpo>
<centro>
<nombre del formulario="mainForm" enctype="multipart/form-data" action="proceso.asp" método=post>
<tipo de entrada=nombre de archivo=miarchivo><br>
<tipo de entrada=nombre de envío=valor correcto="OK">
</formulario>
</centro>
</cuerpo>
</html>
Tenga en cuenta que enctype="multipart/form-data" debe tener este atributo en el formulario; de lo contrario, no se obtendrán los datos cargados. A continuación, debemos realizar el procesamiento necesario de los datos obtenidos del navegador en Process.asp, porque los datos que obtenemos en Process.asp no solo contienen los datos de las imágenes cargadas que queremos, sino que también contienen otra información inútil que necesitamos. para eliminar datos redundantes y guardar los datos de la imagen procesada en la base de datos. Aquí tomamos access2000 como ejemplo. El código específico es el siguiente (process.asp):
<%
respuesta.buffer=verdadero
tamaño del formulario=solicitud.totalbytes
formdata=solicitud.binaryread(tamaño del formulario)
bncrlf=chrB(13)&chrB(10)
divisor=leftB(formdata,clng(instrb(formdata,bncrlf))-1)
inicio de datos=instrb(datosdeformulario,bncrlf&bncrlf)+4
final de datos = instrb (inicio de datos + 1, datos de formulario, divisor) -inicio de datos
misdatos=midb(datos del formulario,inicio de datos,final de datos)
setconnGraph=server.CreateObject("ADODB.conexión")
connGraph.ConnectionString="driver={MicrosoftAccessDriver(*.mdb)};DBQ="&server.MapPath("images.mdb")&";uid=;PWD=;"
connGraph.Open
setrec=servidor.createobject("ADODB.recordset")
rec.Open"SELECT*FROM[imágenes]dondeidisnull",connGraph,1,3
rec.añadirnuevo
rec("img").appendchunkmydata
actualización rec.
rec.cerrar
setrec=nada
setconnGraph=nada
%>
Bien, ahora hemos guardado las imágenes cargadas en una base de datos llamada imágenes.mdb. El trabajo restante es mostrar los datos de la imagen en la base de datos en la página web. Generalmente, en HTML, la etiqueta <IMG> se usa para mostrar imágenes, es decir, <IMGSRC="image path">, pero nuestras imágenes se guardan en la base de datos. ¿Qué es la "ruta de la imagen"? Jaja, de hecho, además de especificar la ruta, este atributo SRC también se puede usar así:
<IMGSRC="showimg.asp?id=xxx">
Entonces, todo lo que tenemos que hacer es leer los datos calificados de la base de datos en showimg.asp y devolverlos al atributo SRC. El código específico es el siguiente (showimg.asp):
<%
setconnGraph=server.CreateObject("ADODB.conexión")
connGraph.ConnectionString="driver={MicrosoftAccessDriver(*.mdb)};DBQ="&
servidor.MapPath("imagenes.mdb")&";uid=;PWD=;"
connGraph.Open
setrec=servidor.createobject("ADODB.recordset")
strsql="selectimgfromimageswhereid="&trim(solicitud("id"))
rec.openstrsql,connGraph,1,1
Respuesta.ContentType="imagen/*"
Respuesta.BinaryWriterec("img").getChunk(7500000)
rec.cerrar
setrec=nada
setconnGraph=nada
%>
Tenga en cuenta que se debe especificar Response.ContentType="image/*" antes de enviarlo al navegador.
para mostrar la imagen normalmente.
Lo último a tener en cuenta es que el procesamiento en mi proceso.asp no tiene en cuenta que hay otros datos en la primera página (upload.htm), como <INPUT type=tesxt name=userid>, etc., si existen estos elementos, su proceso.asp debe prestar atención al procesamiento de datos innecesarios.