Buscar en Asptutor     
Demo Tienda Virtual Tutorcar
 Navegacion->Inicio | Active Server Pages  

La web de los recursos y ejemplos de asp

Versión para imprimir

 

Alojado en:


urbe-networks.com

Recomienda esta pagina a un amigo

Servicios Gratuitos

Articulos relacionados

Utilizar GetRows()

Tienda Virtual - Carrito de compra

Messenger a través de BD en ASP

Miniaplicacion de comercio electronico

Objeto Datagrid de ASP.NET en ASP

Acotación de resultados

Introduccion

El Objeto Browser Capabilities

Un calendario en ASP (Revision 3)

Como mostrar una imagen almacenada en una Base de datos

El Objeto TextStream

Messenger a través de BD en ASP

La Coleccion ServerVariables

Mostrando una imagen al azar de nuestro disco (Ejemplo de FSO)

Ejemplos de codigo ADO

El Objeto Response


Enlaces recomendados

   

Tutorial ASP

Insertar imágenes en una base de datos
Este articulo ha sido leído 145.494 veces

Insertar imágenes en una base de datos


 Articulo enviado por Virtus    
 

Introducción

A través de este articulo aprenderás paso a paso lo que siempre habías querido saber sobre la inserción de datos binarios (imágenes, ficheros zip, doc, etc) en una base de datos. Y todo esto sin la necesidad de utilizar ningún componente externo ni dll, todo mediante texto plano ASP (VBScript), nada mas.

Por qué almacenar datos binarios en una base de datos?

Trabajar con datos binarios en bases de datos es caro, caro en términos de recursos y tiempo del servidor. Bueno , habiendo ya dicho esto, en algunos casos extremadamente importante guardar todo tipo de datos en algún lugar centralizado , como por ejemplo , una base de datos. Tu puedes construir después algunas paginas ASP personalizadas que lean los datos de la base de datos y los guarde en carpetas temporales en el disco duro, y utilizar después estos ficheros para ser mostrados cuando sean necesarios. Entonces, después de algún tiempo de expiración, pueden ser refrescados de nuevo desde la base de datos actualizada. Posibilidades hay infinitas.

Qué necesito?

Todo lo que vamos a utilizar es paginas ASP simples. La base de datos que he elegido es Microsoft Access. También podemos trabajar con SQL Server, el procedimiento es el mismo , así que vosotros decidís.

Crear la base de datos Access

A partir de Microsoft Access crear una nueva base de datos con el nombre 'FileDB.mdb'. Después crear una nueva tabla de nombre 'Files'. La estructura de datos de esta tabla debe coincidir con la abajo indicada (no olvidar que el campo ID es la primary key ) :

Loader.asp

Abre tu notepad.exe (o cualquier otro editor ASP) y crea un nuevo fichero. Guardalo como 'Loader.asp'. Ahora copia el texto de abajo y pégalo en la nueva pagina. Guardalo todo. Esta pagina 'Loader.asp' es la misma que encontrareis en la sección anterior 'Upload ficheros' , ya que todo el código ASP necesario para insertar datos binarios en una base de datos, y para enviar ficheros al servidor, se encuentran presentes en este fichero de clase 'Loader.asp'.

<%
  ' -- Loader.asp --
  ' -- version 1.5
  ' -- last updated 6/13/2002

  
  Class Loader
    Private dict
    
    Private Sub Class_Initialize
      Set dict = Server.CreateObject("Scripting.Dictionary")
    End Sub
    
    Private Sub Class_Terminate
      If IsObject(intDict) Then
        intDict.RemoveAll
        Set intDict = Nothing
      End If
      If IsObject(dict) Then
        dict.RemoveAll
        Set dict = Nothing
      End If
    End Sub

    Public Property Get Count
      Count = dict.Count
    End Property

    Public Sub Initialize
      If Request.TotalBytes > 0 Then
        Dim binData
          binData = Request.BinaryRead(Request.TotalBytes)
          getData binData
      End If
    End Sub
    
    Public Function getFileData(name)
      If dict.Exists(name) Then
        getFileData = dict(name).Item("Value")
        Else
        getFileData = ""
      End If
    End Function

    Public Function getValue(name)
      Dim gv
      If dict.Exists(name) Then
        gv = CStr(dict(name).Item("Value"))
        
        gv = Left(gv,Len(gv)-2)
        getValue = gv
      Else
        getValue = ""
      End If
    End Function
    
    Public Function saveToFile(name, path)
      If dict.Exists(name) Then
        Dim temp
          temp = dict(name).Item("Value")
        Dim fso
          Set fso = Server.CreateObject("Scripting.FileSystemObject")
        Dim file
          Set file = fso.CreateTextFile(path)
            For tPoint = 1 to LenB(temp)
                file.Write Chr(AscB(MidB(temp,tPoint,1)))
            Next
            file.Close
          saveToFile = True
      Else
          saveToFile = False
      End If
    End Function
    
    Public Function getFileName(name)
      If dict.Exists(name) Then
        Dim temp, tempPos
          temp = dict(name).Item("FileName")
          tempPos = 1 + InStrRev(temp, "\")
          getFileName = Mid(temp, tempPos)
      Else
        getFileName = ""
      End If
    End Function
    
    Public Function getFilePath(name)
      If dict.Exists(name) Then
        Dim temp, tempPos
          temp = dict(name).Item("FileName")
          tempPos = InStrRev(temp, "\")
          getFilePath = Mid(temp, 1, tempPos)
      Else
        getFilePath = ""
      End If
    End Function
    
    Public Function getFilePathComplete(name)
      If dict.Exists(name) Then
        getFilePathComplete = dict(name).Item("FileName")
      Else
        getFilePathComplete = ""
      End If
    End Function

    Public Function getFileSize(name)
      If dict.Exists(name) Then
        getFileSize = LenB(dict(name).Item("Value"))
      Else
        getFileSize = 0
      End If
    End Function

    Public Function getFileSizeTranslated(name)
      If dict.Exists(name) Then
        temp = 1 + LenB(dict(name).Item("Value"))
          If Len(temp) <= 3 Then
            getFileSizeTranslated = temp & " bytes"
          ElseIf Len(temp) > 6 Then
            temp = FormatNumber(((temp / 1024) / 1024), 2)
            getFileSizeTranslated = temp & " megabytes"  
          Else
            temp = FormatNumber((temp / 1024), 2)
            getFileSizeTranslated = temp & " kilobytes"
          End If
      Else
        getFileSizeTranslated = ""
      End If
    End Function
    
    Public Function getContentType(name)
      If dict.Exists(name) Then
        getContentType = dict(name).Item("ContentType")
      Else
        getContentType = ""
      End If
    End Function

  Private Sub getData(rawData)
    Dim separator 
      separator = MidB(rawData, 1, InstrB(1, rawData, ChrB(13)) - 1)

    Dim lenSeparator
      lenSeparator = LenB(separator)

    Dim currentPos
      currentPos = 1
    Dim inStrByte
      inStrByte = 1
    Dim value, mValue
    Dim tempValue
      tempValue = ""

    While inStrByte > 0
      inStrByte = InStrB(currentPos, rawData, separator)
      mValue = inStrByte - currentPos

      If mValue > 1 Then
        value = MidB(rawData, currentPos, mValue)

        Dim begPos, endPos, midValue, nValue
        Dim intDict
          Set intDict = Server.CreateObject("Scripting.Dictionary")
    
          begPos = 1 + InStrB(1, value, ChrB(34))
          endPos = InStrB(begPos + 1, value, ChrB(34))
          nValue = endPos

        Dim nameN
          nameN = MidB(value, begPos, endPos - begPos)

        Dim nameValue, isValid
          isValid = True
          
          If InStrB(1, value, stringToByte("Content-Type")) > 1 Then

            begPos = 1 + InStrB(endPos + 1, value, ChrB(34))
            endPos = InStrB(begPos + 1, value, ChrB(34))
  
            If endPos = 0 Then
              endPos = begPos + 1
              isValid = False
            End If
            
            midValue = MidB(value, begPos, endPos - begPos)
              intDict.Add "FileName", trim(byteToString(midValue))
                
            begPos = 14 + InStrB(endPos + 1, value, stringToByte("Content-Type:"))
            endPos = InStrB(begPos, value, ChrB(13))
            
            midValue = MidB(value, begPos, endPos - begPos)
              intDict.Add "ContentType", trim(byteToString(midValue))
            
            begPos = endPos + 4
            endPos = LenB(value)
            
            nameValue = MidB(value, begPos, endPos - begPos)
          Else
            nameValue = trim(byteToString(MidB(value, nValue + 5)))
          End If

          If isValid = true Then
            intDict.Add "Value", nameValue
            intDict.Add "Name", nameN

            dict.Add byteToString(nameN), intDict
          End If
      End If

      currentPos = lenSeparator + inStrByte
    Wend
  End Sub
  
  End Class

  Private Function stringToByte(toConv)
    Dim tempChar
     For i = 1 to Len(toConv)
       tempChar = Mid(toConv, i, 1)
      stringToByte = stringToByte & chrB(AscB(tempChar))
     Next
  End Function

  Private Function byteToString(toConv)
    For i = 1 to LenB(toConv)
      byteToString = byteToString & chr(AscB(MidB(toConv,i,1))) 
    Next
  End Function
%>

 


Insert.htm

Abre el notepad y guarda el texto de abajo en un fichero con el nombre Insert.htm. En este fichero se encuentra el formulario que nosotros usaremos para seleccionar el fichero que queremos almacenar. Vemos que Form contiene tres campos input y un campo file. De esta forma podemos observar que podemos enviar tanto datos binarios como campos comunes. También es importante especificar que el método de Form es POST y su enctype esta puesto a multipart/form-data. Es indispensable hacer esto si queremos trabajar con ficheros binarios.

<!-- insert.htm -->
<html>
<head>
	<title>Inserts Images into Database</title>
	<style>
		body, input { font-family:verdana,arial; font-size:10pt; }
	</style>
</head>
<body>
	<p align="center">
		<b>Inserting Binary Data into Database</b><br>
		<a href="show.asp">To see inserted data click here</a>
	</p>
	
	<table border="0" align="center">
	<tr>
	<form method="POST" enctype="multipart/form-data" action="Insert.asp">
	<td>First Name :</td><td>
		<input type="text" name="fname" size="40"></td>
	</tr>
	<td>Last Name :</td><td>
		<input type="text" name="lname" size="40"></td>
	</tr>
	<td>Profession :</td><td>
		<input type="text" name="profession" size="40">
	</td></tr>
	<td>File :</td><td>
		<input type="file" name="file" size="40"></td></tr>
	<td> </td><td>
		<input type="submit" value="Submit"></td></tr>
	</form>
	</tr>
	</table>

</body>
</html>

 

Insert.asp

Abre el notepad y guarda el texto de abajo en un fichero con el nombre Insert.htm. En este fichero se encuentra la acción a realizar con los datos del formulario enviado. El recibe los datos binarios del formulario y los procesa internamente usando el código de Loader.

<% ' Insert.asp %>
<!--#include file="Loader.asp"-->
<%
  Response.Buffer = True

  ' load object
  Dim load
    Set load = new Loader
    
    ' calling initialize method
    load.initialize
    
  ' File binary data
  Dim fileData
    fileData = load.getFileData("file")
  ' File name
  Dim fileName
    fileName = LCase(load.getFileName("file"))
  ' File path
  Dim filePath
    filePath = load.getFilePath("file")
  ' File path complete
  Dim filePathComplete
    filePathComplete = load.getFilePathComplete("file")
  ' File size
  Dim fileSize
    fileSize = load.getFileSize("file")
  ' File size translated
  Dim fileSizeTranslated
    fileSizeTranslated = load.getFileSizeTranslated("file")
  ' Content Type
  Dim contentType
    contentType = load.getContentType("file")
  ' No. of Form elements
  Dim countElements
    countElements = load.Count
  ' Value of text input field "fname"
  Dim fnameInput
    fnameInput = load.getValue("fname")
  ' Value of text input field "lname"
  Dim lnameInput
    lnameInput = load.getValue("lname")
  ' Value of text input field "profession"
  Dim profession
    profession = load.getValue("profession")  
    
  ' destroying load object
  Set load = Nothing
%>

<html>
<head>
  <title>Inserts Images into Database</title>
  <style>
    body, input, td { font-family:verdana,arial; font-size:10pt; }
  </style>
</head>
<body>
  <p align="center">
    <b>Inserting Binary Data into Database</b><br>
    <a href="show.asp">To see inserted data click here</a>
  </p>
  
  <table width="700" border="1" align="center">
  <tr>
    <td>File Name</td><td><%= fileName %></td>
  </tr><tr>
    <td>File Path</td><td><%= filePath %></td>
  </tr><tr>
    <td>File Path Complete</td><td><%= filePathComplete %></td>
  </tr><tr>
    <td>File Size</td><td><%= fileSize %></td>
  </tr><tr>
    <td>File Size Translated</td><td><%= fileSizeTranslated %></td>
  </tr><tr>
    <td>Content Type</td><td><%= contentType %></td>
  </tr><tr>
    <td>No. of Form Elements</td><td><%= countElements %></td>
  </tr><tr>
    <td>First Name</td><td><%= fnameInput %></td>
  </tr><tr>
    <td>Last Name</td><td><%= lnameInput %></td>
  </tr>
  <tr>
    <td>Profession</td><td><%= profession %></td>
  </tr>
  </table><br><br>
  
  <p style="padding-left:220;">
  <%= fileName %> data received ...<br>
  <%
    ' Checking to make sure if file was uploaded
    If fileSize > 0 Then
    
      ' Connection string
      Dim connStr
        connStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="
        connStr = connStr & Server.MapPath("FileDB.mdb")
    
      ' Recordset object
      Dim rs
        Set rs = Server.CreateObject("ADODB.Recordset")
        
        rs.Open "Files", connStr, 2, 2
        
        ' Adding data
        rs.AddNew
          rs("File Name") = fileName
          rs("File Size") = fileSize
          rs("File Data").AppendChunk fileData
          rs("Content Type") = contentType
          rs("First Name") = fnameInput
          rs("Last Name") = lnameInput
          rs("Profession") = profession
        rs.Update
        
        rs.Close
        Set rs = Nothing
        
      Response.Write "<font color=""green"">File was successfully uploaded..."
      Response.Write "</font>"
    Else
      Response.Write "<font color=""brown"">No file was selected for uploading"
      Response.Write "...</font>"
    End If
      
      
    If Err.number <> 0 Then
      Response.Write "<br><font color=""red"">Something went wrong..."
      Response.Write "</font>"
    End If
  %>
  </p>
  
  <br>
  <table border="0" align="center">
  <tr>
  <form method="POST" enctype="multipart/form-data" action="Insert.asp">
  <td>First Name :</td><td>
    <input type="text" name="fname" size="40" ></td>
  </tr>
  <td>Last Name :</td><td>
    <input type="text" name="lname" size="40" ></td>
  </tr>
  <td>Profession :</td><td>
    <input type="text" name="profession" size="40" ></td>
  </tr>
  <td>File :</td><td>
    <input type="file" name="file" size="40"></td>
  </tr>
  <td> </td><td>
    <input type="submit" value="Submit"></td>
  </tr>
  </form>
  </tr>
  </table>

</body>
</html>

 

Explicación

Mediante dos métodos distintos del fichero de clase 'Loader.asp' recibimos los datos binarios y los datos de texto. Usaremos entonces load.getFileData(inputTagName) para asignar los datos binarios y el método load.getValue(inputTagName) para asignar los elementos de texto. También recuerda que una vez llamado el método load.initialize, ya no podremos acceder normalmente al contenido del formulario usando Request.Form, porque daría un error. Simplemente usa load.getvalue(inputTagName) para asignar el valor del campo.

Visualización de los datos binarios almacenados en la base de datos

Una vez que hemos almacenado todo en nuestra base de datos, el siguiente paso es poder mostrar el contenido. Para esto utilizaremos una pagina que vamos a crear con el nombre 'Show.asp'. En esta pagina vemos una línea de código un poco peculiar y es cuando mostramos el recordset de todos los registros de la base de datos , hay un link por cada registro a la pagina 'file.asp'. Pues bien, 'file.asp' será el fichero que nos mostrara realmente los datos binarios de la base de datos.

<%
   ' -- show.asp --
   ' Generates a list of uploaded files
   
   Response.Buffer = True
   
   ' Connection String
   Dim connStr
      connStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & _
         Server.MapPath("FileDB.mdb")
%>
<html>
<head>
   <title>Inserts Images into Database</title>
   <style>
      body, input, td { font-family:verdana,arial; font-size:10pt; }
   </style>
</head>
<body>
   <p align="center">
      <b>Showing Binary Data from the Database</b><br>
      <a href="insert.htm">To insert data click here</a>
   </p>
   
   <table width="700" border="1" align="center">
<%
   ' Recordset Object
   Dim rs
      Set rs = Server.CreateObject("ADODB.Recordset")
      
      ' opening connection
      rs.Open "select [ID],[File Name],[File Size],[Content Type],[First Name]," & _
         "[Last Name],[Profession] from Files order by [ID] desc", connStr, 3, 4

      If Not rs.EOF Then
         Response.Write "<tr><td colspan=""7"" align=""center""><i>"
         Response.Write "No. of records : " & rs.RecordCount
         Response.Write ", Table : Files</i><br>"
         Response.Write "</td></tr>"
   
         While Not rs.EOF
            Response.Write "<tr><td>"
            Response.Write rs("ID") & "</td><td>"
            Response.Write "<a href=""file.asp?ID=" & rs("ID") & """>"
            Response.Write rs("File Name") & "</a></td><td>"
            Response.Write rs("File Size") & "</td><td>"
            Response.Write rs("Content Type") & "</td><td>"
            Response.Write rs("First Name") & "</td><td>"
            Response.Write rs("Last Name") & "</td><td>"
            Response.Write rs("Profession")
            Response.Write "</td></tr>"
            rs.MoveNext
         Wend
      Else
         Response.Write "No Record Found"
      End If
      
      rs.Close
      Set rs = Nothing
%>
   </table>
</body>
</html>

 

 

file.asp

Finalmente vamos a crear el fichero file.asp el cual nos mostrara por fin los datos binarios de nuestra base de datos.

 

<%
   ' -- file.asp --
   ' Retrieves binary files from the database
   
   Response.Buffer = True
   
   ' ID of the file to retrieve
   Dim ID
      ID = Request("ID")
      
   If Len(ID) < 1 Then
      ID = 7
   End If
   
   ' Connection String
   Dim connStr
      connStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & _
         Server.MapPath("FileDB.mdb")
   
   ' Recordset Object
   Dim rs
      Set rs = Server.CreateObject("ADODB.Recordset")
      
      ' opening connection
      rs.Open "select [File Data],[Content Type] from Files where ID = " & _
         ID, connStr, 2, 4

      If Not rs.EOF Then
         Response.ContentType = rs("Content Type")
         Response.BinaryWrite rs("File Data")
      End If
      
      
      rs.Close
      Set rs = Nothing
%>

 

 


 

¿Estas empezando y este articulo es muy complejo para tí?
Empieza por el principio, visita Ejemplos Básicos

Puedes obtener un listado completo de todos los artículos y ejemplos de ASP en http://www.asptutor.com/asp/todoslosarticulos.asp
 

Valora este articulo   Malo Excelente  
362 usuarios han valorado este articulo. Valoracion media:

Nota: Para cualquier consulta u opinión sobre este articulo puedes usar los foros

 

 

AspTutor lo hacemos entre todos ¿Como vas a colaborar hoy?


Google

 

Descargas de manuales¦ Ejemplos de código ¦ Artículos mas visitados ¦ Envía tu articulo ¦ Foros ¦
  Libro de visitas ¦Crea un enlace con ASPTutor 
 

    © 2001-Hasta hoy  Pedro Rufo Martín  contactar