5. Cargue imágenes y almacene datos binarios usando el código de control de fuente de datos ASP.NET 2.0.
Aunque el método ADO.NET funciona en el contexto de una aplicación ASP.NET 2.0, también puede usar controles de fuente de datos ASP.NET 2.0 para almacenar binarios. Los datos binarios se almacenan en una base de datos, lo que no requiere que escriba código ADO.NET. El control SqlDataSource utilizado en este programa de demostración contiene un InsertCommand y parámetros correspondientes a los valores de Título, MIMEType e ImageData:
<asp:SqlDataSource ID="UploadPictureDataSource" runat="servidor"
Cadena de conexión="..."
InsertCommand="INSERTAR EN [Imágenes] ([Título], [MIMEType], [ImageData]) VALORES (@Title, @MIMEType, @ImageData)">
<InsertParameters>
<asp:Nombre del parámetro="Título" Tipo="Cadena" />
<asp:Nombre del parámetro="MIMEType" Tipo="Cadena" />
<asp:Nombre del parámetro="ImageData" />
</Insertar parámetros>
</asp:SqlDataSource>
Tenga en cuenta que aquí el parámetro ImageData no especifica un tipo. Si intenta utilizar el asistente de GUI para crear la sintaxis de SqlDataSource, probablemente especificará Type="Object" para él. Sin embargo, este Type="Object" producirá un parámetro de tipo sql_variant. Sin embargo, el tipo sql_variants no se puede utilizar para almacenar imágenes o tipos de datos varbinary (MAX) porque el tamaño de datos intrínseco de sql_variant no puede exceder los 8000 bytes. (Si intenta utilizar Type="Object" y luego intenta guardar datos binarios que superan los 8000 bytes de tamaño, el sistema generará una excepción con el mensaje "El parámetro '@ImageData' excede el límite de tamaño para el tipo de datos sql_variant "; Si intenta agregar datos binarios con un tamaño inferior a 8000 bytes, la excepción mostrará el mensaje "No se permite la conversión implícita del tipo de datos sql_variant a varbinary(max)").
Además, el control DetailsView contiene dos TemplateFields. Entre ellos, se usa un control TextBox en un TemplateField para mostrar la barra de título; el otro usa un control FileUpload para representar la barra ImageData. El resultado final es una interfaz de usuario similar a la de la sección "Cargar imágenes y almacenar datos binarios usando código ADO.NET". Cuando se hace clic en el botón "Insertar" de DetailsView, se activa su evento Inserting. En este momento, los datos binarios deben obtenerse del control FileUpload, leerse en una matriz de bytes y asignarse a los parámetros apropiados:
Protected Sub UploadPictureUI_ItemInserting(ByVal). remitente como objeto, ByVal y como System.Web.UI.WebControls.DetailsViewInsertEventArgs) maneja UploadPictureUI.ItemInserting
'Haga referencia al control FileUpload Dim UploadedFile As FileUpload = CType(UploadPictureUI.FindControl("UploadedFile"), FileUpload)
'Asegúrese de que un archivo se haya cargado correctamente si UploadedFile.PostedFile no es nada o si no String.IsNullOrEmpty(UploadedFile.PostedFile.FileName) o si no UploadedFile .PostedFile .InputStream no es nada entonces
...muestra mensaje de error...
e.Cancelar = Verdadero
Salir Sub
End If
'Asegúrate de que estamos tratando con un archivo JPG o GIF
Extensión tenue As String = Path.GetExtension(UploadedFile.PostedFile.FileName).ToLower()
Dim MIMEType como cadena = nada
Seleccione la extensión del caso
Caso ".gif"
Tipo MIME = "imagen/gif"
Caso ".jpg", ".jpeg", ".jpe"
Tipo MIME = "imagen/jpeg"
Caso ".png"
Tipo MIME = "imagen/png"
Caso más
'Carga de tipo de archivo no válido... se muestra un mensaje de error...
e.Cancelar = Verdadero
Salir Sub
Fin Seleccione
"Especificar los valores de los parámetros MIMEType e ImageData
e.Values("MIMEType") = MIMEType
'Carga el InputStream de FileUpload en la matriz de bytes
Atenuar imageBytes (UploadedFile.PostedFile.InputStream.Length) como byte
UploadedFile.PostedFile.InputStream.Read(imageBytes, 0, imageBytes.Length)
e.Values("ImageData") = imagenBytes
End Sub
Al igual que el controlador de eventos Click del botón "Insertar" anterior, el controlador de eventos Inserting de DetailsView también realiza la misma lógica: solo hay algunas diferencias menores de sintaxis. En primer lugar, dado que el control FileUpload está dentro de una plantilla, se debe hacer referencia a él mediante programación mediante el método FindControl("controlID"). Una vez que se hace referencia a él, se realizan las mismas comprobaciones para garantizar que un archivo se cargó correctamente y que se permitió la extensión adecuada. Una ligera diferencia con el controlador de eventos de inserción de DetailsView es que si se produce un error, debemos notificar a DetailsView para que detenga el trabajo de inserción correspondiente; esto se logra estableciendo la propiedad e.Cancel en True.
Después de verificar, los parámetros MIMEType e ImageData se asignarán usando la sintaxis e.Values("parameterName")=value. Al igual que en el ejemplo anterior de ADO.NET, primero lea los datos binarios en una matriz de bytes y luego asigne la matriz de bytes al parámetro.
6. Mostrar contenido binario
No importa qué tecnología utilice para almacenar datos en la base de datos, para recuperar y mostrar datos binarios, necesitamos crear una nueva página ASP.NET. La página denominada ShowPicture.aspx le pasará un ID de imagen a través de la cadena de consulta y devolverá los datos binarios del campo ImageData del producto especificado. Una vez completado, se puede ver una imagen específica visitando la dirección /ShowPicture.aspx?PictureID=picutreID. Por lo tanto, para mostrar una imagen en una página web, podemos usar un control de imagen y establecer su propiedad ImageUrl en la URL adecuada.
Tenga en cuenta que ShowPicture.aspx no incluye ninguna etiqueta HTML en su página .aspx. En el controlador de eventos Page_Load de la clase de código subyacente, se utilizará código ADO.NET para recuperar MIMEType e ImageData de la fila Imágenes especificada de la base de datos. Luego, el ContentType de la página se establece en el valor del campo MIMEType y los datos binarios se generan usando Response.BinaryWrite(ImageData):
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me. Carga
Dim PictureID As Integer = Convert.ToInt32(Request.QueryString("PictureID"))
'Conéctese a la base de datos y devuelva el contenido de la imagen y el tipo MIME de la imagen especificada usando myConnection como New SqlConnection(ConfigurationManager.ConnectionStrings("ImageGalleryConnectionString"). ConnectionString)
Const SQL As String = "SELECCIONE [MIMEType], [ImageData] DESDE [Imágenes] DONDE [PictureID] = @PictureID"
Atenuar myCommand como nuevo SqlCommand (SQL, myConnection)
myCommand.Parameters.AddWithValue("@PictureID", PictureID)
myConnection.Open()
Dim myReader As SqlDataReader = myCommand.ExecuteReader
Si myReader.Read Entonces
Respuesta.ContentType = myReader("MIMEType").ToString()
Respuesta.BinaryWrite(myReader("ImageData"))
Finalizar si
myReader.Close()
miConexión.Cerrar()
Finalizar el uso
Subtítulo final