none
Recibir Base64 en [WebMethod] para luego convertirlo en Image y guardarlo en el server. RRS feed

  • Pregunta

  • Saludos, tengo un [WebMethod] donde recibo una variable string, donde lo que pienso es convertirla a imagen para luego poder guardarla en el servidor, la variable la recibo de la siguiente forma:

     
    [WebMethod]
        public static string SubirLogo(string Logo, string NombreArchivo)
        {
    
    
            try
            {
                ObjSession session_Adm = new ObjSession();
    
                session_Adm = (ObjSession)HttpContext.Current.Session["Admin"];
    
                //Validar si existe sesion
                if (session_Adm == null)
                {
                    return null;
                }
    
                string Ok  = Base64ToImage(Logo, NombreArchivo);
                if (Ok == "Logo subido")
                {
                    return "Exitoso," + Ok;
                }
                else {
                    return "Error,Hubo un problema al subir el Logo";
                }
            }
            catch (Exception Ex)
            {
                return "Error," + Ex.Message;
            }
        }

    Y de esta forma es que pienso convertirla a imagen y poderla guardar en el server

    public static string Base64ToImage(string base64String, string nombre)
        {
            try
            {
                // Convert Base64 String to byte[]
                byte[] imageBytes = GetBytes(base64String);
                
                MemoryStream ms = new MemoryStream(imageBytes);
                ms.Position = 0;
                System.Drawing.Image image = System.Drawing.Image.FromStream(ms, true,true);
                ms.Close();
    
                string ruta = System.Web.HttpContext.Current.Server.MapPath("~/images/Gimnasios/");
                //    fup_Logo.PostedFile.SaveAs(ruta + nombreArchivo);
                image.Save(ruta + nombre, System.Drawing.Imaging.ImageFormat.Png);
                return "Logo subido";
            }
            catch (Exception Ex)
            {
                return "Error," + Ex.Message;
            }
        }
    
        static byte[] GetBytes(string str)
        {
            byte[] bytes = new byte[str.Length * sizeof(char)];
            System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
            return bytes;
        }

    La variable Logo que es donde recibo el base64 parece que me esta llegando bien, porque haciendo paso a paso me manda esto

    Pero al momento de crear la imagen y pasarle el MemoryStream ms me tira error, como si no reconociera la variable byte[] o la verdad no se que esta ocurriendo. Este es el pantallazo del error.

    Parece que estoy cometiendo algun error pero no entiendo porque. He visto infinidad de ejemplos en internet iguales que el mio, pero a mi no me funciona.


    Jhonatan Plata http://kayprogramacion.blogspot.com/

    viernes, 21 de octubre de 2016 20:35

Respuestas

  • El GetBytes no se ve nada bien.

    Para empezar, no estás recibiendo sólo un base64. Debes podar esos 22 caracteres iniciales. El b64 comienza luego de la coma.

    Luego haces la copia de un array de char. Deberías usar el método FromBase64String de la clase Convert, y retornar el arreglo que te crea esa función. Algo como

    return Convert.FromBase64String(str.Substring(str.IndexOf(',') + 1));


    • Editado walter_5 viernes, 21 de octubre de 2016 21:28
    • Marcado como respuesta Kaysinho viernes, 21 de octubre de 2016 21:54
    viernes, 21 de octubre de 2016 21:23

Todas las respuestas

  • El GetBytes no se ve nada bien.

    Para empezar, no estás recibiendo sólo un base64. Debes podar esos 22 caracteres iniciales. El b64 comienza luego de la coma.

    Luego haces la copia de un array de char. Deberías usar el método FromBase64String de la clase Convert, y retornar el arreglo que te crea esa función. Algo como

    return Convert.FromBase64String(str.Substring(str.IndexOf(',') + 1));


    • Editado walter_5 viernes, 21 de octubre de 2016 21:28
    • Marcado como respuesta Kaysinho viernes, 21 de octubre de 2016 21:54
    viernes, 21 de octubre de 2016 21:23
  • hola

    Tienes que quitar el   data:image/png;base64,

    para obtener el binario del archivo que en encodeo a base64, si lo conviertes directo asi como esta fallara

    Regex to parse image data URI

    fijate como usa regular expression para quitar esas parte

    Despues debes usar el

    Convert.FromBase64String Method (String)

    para obtener el binary en base al string, ese metodo GetBytes() lo veo algo raro usa el Convert directamente

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 21 de octubre de 2016 21:41
  • Gracias, si era eso. 

    Jhonatan Plata http://kayprogramacion.blogspot.com/

    viernes, 21 de octubre de 2016 21:54