2010-02-18 11 views
14

Tengo una solución ASP.NET MVC basada en Entity Framework con Microsoft SQL Server 2008. Necesito crear una función que permita a mis usuarios subir archivos.Guarde los archivos en la base de datos con entidad marco

Lo que me gustaría es:

  • Una solución que utiliza el marco de la entidad para almacenar archivos en la base de datos
  • Una solución que detecta y evita la posibilidad de subir el mismo archivo dos veces a través de una especie de almohadilla/checksum
  • Consejos sobre el diseño de la base de datos/tabla

Respuesta

10

la forma "correcta" para almacenar un archivo en una base de datos de SQL Server 2008 es use the FILESTREAM data type. No estoy al tanto de que Entity Framework lo respalde, pero ciertamente puede intentar y ver qué sucede.

Dicho esto, la mayoría de las veces, cuando las personas hacen esto, no almacenan el archivo en la base de datos. Hacerlo significa que debe pasar por ASP.NET y el servidor de la base de datos solo para servir un archivo que podría estar sirviendo directamente desde el servidor web. También puede complicar un poco la imagen de respaldo para su base de datos y sitio. Entonces, cuando cargamos archivos a MVC/Entity Framework, almacenamos solo una referencia a la ubicación del archivo en la base de datos y almacenamos el archivo en otro lugar.

Obviamente, la estrategia adecuada para usted depende en gran medida de los detalles de su aplicación.

40

En su modelo de entidad, asigne la columna de la base de datos BLOB a una propiedad byte[]. Asigne el contenido del archivo cargado a esa propiedad del objeto de entidad y guarde los cambios en el ObjectContext.

Para calcular un hash, se puede utilizar la clase MD5CryptoServiceProvider

+12

¿Qué pasa con esa respuesta? ¿Podría al menos dar una razón para la votación negativa? Esa es la única cosa que realmente odio en SO: personas que votan sin una explicación ... es tan inútil –

+5

No tengo idea ... pero toma un +1 por tu problema. :) –

+4

Lo malo de esto es que los archivos de gran tamaño pueden explotar tu memoria RAM mediante el uso de matrices de bytes en lugar de secuencias :( – jocull

5

Así es como lo hago por Podcasts:

 

ID  Title   Path     Summary    UploadDate 
--- -----  --------    ----------------  ----------- 
1  TestPodcast /Podcasts/ep1.mp3  A test podcast   2010-02-12 

Los path almacena una referencia a la ubicación física del Podcast. Utilicé una publicación de Scott Hanselman en File Uploads with ASP.NET MVC para tratar con la parte de carga de archivos.

+0

Esto podría estar bien para una aplicación pequeña, pero suponiendo que una aplicación compleja con requisitos de copia de seguridad y archivos cambian con el tiempo, no podrá volver a un punto específico en el tiempo – ozz

+1

@Ozz Tiene toda la razón, pero esto no es para archivos que cambian con el tiempo. La esperanza es que una vez que publique un podcast, no retroceda y simplemente sobrescriba ese podcast. –

Cuestiones relacionadas