none
Asp Mvc subir imagen RRS feed

  • Pregunta

  • Hola:

     Me encuentro desarrollando una aplicación con ASP MVC, tengo la necesidad de crear una entidad Producto y a la vez cargar una Imagen del producto, se que no es aconsejable almacenar la imagen dentro de la Base de datos y en su lugar solo almacenar el path de ubicación, para esto me surgen varias interrogantes:

     1. ¿Como cargar una imagen usando ASPMVC?

     2. Mi aplicación estará hospedada en Azure, como puedo conocer la ruta de la imagen

     3. Desde su experiencia cual es la manera mas fácil para relacionar la imagen con la entidad, ¿se crea una nomenclatura especifica?

     Agradezco de antemano su respuestas.


    Saludos desde Monterrey, Nuevo León, México!!!

    jueves, 21 de abril de 2016 14:32

Respuestas

  • 1. En la Vista, dentro del <form>, pon un <input type="file"> para que se pueda subir el fichero. Busca un ejemplo en Internet, porque hay que tocar el encoding del Form para que funcione, y hay que recoger el PostedFile en el método de acción del controlador.

    2. Sí que se recomendable almacenar la imagen en la base de datos. Si te preocupa el tamaño del .mdf, puedes activar el modo FILESTREAM para que el propio servidor saque los archivos a una carpeta. Esto es interno en el servidor, y transparente para tu aplicación, que no necesita ver en ningún momento la ruta de la carpeta que usa SQL Server.

    Desgraciadamente, esto no está soportado en SQL Azure. Pero en un Website de Azure tampoco está soportado que salves ficheros dinámicamente en el sistema de archivos. Así que si no quieres salvarlos en BLOBs en la BD, tendrás que recurrir a usar Azure Storage a través de sus correspondientes APIs, que tendrás que aprender.

    3. Si usas un BLOB en la BD (aunque esta lo saque a un archivo usando FILESTREAM), entonces no hay problema de relación, ya que el propio registro contiene las dos cosas. Si usas el Storage de Azure, entonces usa algún código tal como la clave primaria del registro para nombrar los BLOBS del Storage.

    jueves, 21 de abril de 2016 15:00
  • hola

    >>¿Como cargar una imagen usando ASPMVC?

    el path donde ubicas la imagen esta dentro de la estructura del sitio web ?

    si lo esta es tan simple como armar la url relativa a esa imagen

    ahora sino esta dentro de la estructura del sitio vas a tener que crear un handler que envie usando el Response.WriteFile()

    enviando esta en el response

    [ASP.NET] - Guardar Imagen base de datos

    si bien el articulo menciona una db en la primer parte explico como trabajar con archivos en carpetas

    >>Mi aplicación estará hospedada en Azure, como puedo conocer la ruta de la imagen

    pero si es azure entonces la imagen deberia guardarse en un blob storage

    no se guarda en carpetas porque se supone que el sitio tiene que poder balancear entre lso diferentes servidores

    es mas en la db deberias persistir el link del blob storage donde lo agregas, entonces lo recuperas desde alli y envias el byte[] en el Response usando un handler

    >>Desde su experiencia cual es la manera mas fácil para relacionar la imagen con la entidad, ¿se crea una nomenclatura especifica?

    depende, porque en las preguntas planteas dos alternativas muy distintas, no es lo mismo una carpeta a usar blob storage en azure

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 21 de abril de 2016 17:53
  • si usas Azure lo correcto seria usar blob storage

    valida los precios pero hasta donde se los mega de base de datos son mas caros que los de storage, por eso no se persisten archivos en Sql Azure

    igual la tecnica para enviar luego la imagen es la misma ya sea la persitas en la db o en blob storage, en amboas deberias crear un handler, donde recuperes la imagen y al envies en el response

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 21 de abril de 2016 18:35
  • Entonces ¿lo mas rápido para utilizar Azure es almacenar los bytes en un campo dentro de la tabla?

    Es lo más sencillo de programar, pero el almacenamiento en la base de datos saldrá más caro que el almacenamiento usando blobs del Storage. Para pequeños volúmenes de datos da igual, pero si estás pensando en muchos gigabytes, merece la pena que te molestes en estudiar las APIs del Storage.
    jueves, 21 de abril de 2016 20:45

Todas las respuestas

  • 1. En la Vista, dentro del <form>, pon un <input type="file"> para que se pueda subir el fichero. Busca un ejemplo en Internet, porque hay que tocar el encoding del Form para que funcione, y hay que recoger el PostedFile en el método de acción del controlador.

    2. Sí que se recomendable almacenar la imagen en la base de datos. Si te preocupa el tamaño del .mdf, puedes activar el modo FILESTREAM para que el propio servidor saque los archivos a una carpeta. Esto es interno en el servidor, y transparente para tu aplicación, que no necesita ver en ningún momento la ruta de la carpeta que usa SQL Server.

    Desgraciadamente, esto no está soportado en SQL Azure. Pero en un Website de Azure tampoco está soportado que salves ficheros dinámicamente en el sistema de archivos. Así que si no quieres salvarlos en BLOBs en la BD, tendrás que recurrir a usar Azure Storage a través de sus correspondientes APIs, que tendrás que aprender.

    3. Si usas un BLOB en la BD (aunque esta lo saque a un archivo usando FILESTREAM), entonces no hay problema de relación, ya que el propio registro contiene las dos cosas. Si usas el Storage de Azure, entonces usa algún código tal como la clave primaria del registro para nombrar los BLOBS del Storage.

    jueves, 21 de abril de 2016 15:00
  • Hola:

    Desgraciadamente, esto no está soportado en SQL Azure

     Entonces ¿lo mas rápido para utilizar Azure es almacenar los bytes en un campo dentro de la tabla?.


    Saludos desde Monterrey, Nuevo León, México!!!

    jueves, 21 de abril de 2016 15:32
  • hola

    >>¿Como cargar una imagen usando ASPMVC?

    el path donde ubicas la imagen esta dentro de la estructura del sitio web ?

    si lo esta es tan simple como armar la url relativa a esa imagen

    ahora sino esta dentro de la estructura del sitio vas a tener que crear un handler que envie usando el Response.WriteFile()

    enviando esta en el response

    [ASP.NET] - Guardar Imagen base de datos

    si bien el articulo menciona una db en la primer parte explico como trabajar con archivos en carpetas

    >>Mi aplicación estará hospedada en Azure, como puedo conocer la ruta de la imagen

    pero si es azure entonces la imagen deberia guardarse en un blob storage

    no se guarda en carpetas porque se supone que el sitio tiene que poder balancear entre lso diferentes servidores

    es mas en la db deberias persistir el link del blob storage donde lo agregas, entonces lo recuperas desde alli y envias el byte[] en el Response usando un handler

    >>Desde su experiencia cual es la manera mas fácil para relacionar la imagen con la entidad, ¿se crea una nomenclatura especifica?

    depende, porque en las preguntas planteas dos alternativas muy distintas, no es lo mismo una carpeta a usar blob storage en azure

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 21 de abril de 2016 17:53
  • Hola Leandro:

     Creo que lo mas sencillo sera almacenarlo en una campo de la tabla, esto en base a sus comentarios.

     La aplicación estará hospedad en Azure pero desconocía si azure permitía trabajar igual que otros servidores, pero ya con sus respuestas entiendo que no es así. Entonces me inclino mas a almacenar estos archivos en la tabla.


    Saludos desde Monterrey, Nuevo León, México!!!

    jueves, 21 de abril de 2016 18:00
  • si usas Azure lo correcto seria usar blob storage

    valida los precios pero hasta donde se los mega de base de datos son mas caros que los de storage, por eso no se persisten archivos en Sql Azure

    igual la tecnica para enviar luego la imagen es la misma ya sea la persitas en la db o en blob storage, en amboas deberias crear un handler, donde recuperes la imagen y al envies en el response

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 21 de abril de 2016 18:35
  • Entonces ¿lo mas rápido para utilizar Azure es almacenar los bytes en un campo dentro de la tabla?

    Es lo más sencillo de programar, pero el almacenamiento en la base de datos saldrá más caro que el almacenamiento usando blobs del Storage. Para pequeños volúmenes de datos da igual, pero si estás pensando en muchos gigabytes, merece la pena que te molestes en estudiar las APIs del Storage.
    jueves, 21 de abril de 2016 20:45