La entrada no es válida en Base 64 de la cadena, ya que contiene una base no de 64 caracteres

Tengo un servicio REST que lee un archivo y lo envía a otra consola de la aplicación después de la conversión de matriz de Bytes y luego a cadena Base64. Esta parte ocurre correcto, pero cuando la misma secuencia en que se recibe en la aplicación, se obtiene de manipular y no es más válido de cadena Base64. Algunos de chatarra de caracteres introducción en la secuencia.

La excepción de que puedo obtener, mientras que la conversión de la corriente de vuelta a Byte es «La entrada no es válida en Base 64 de la cadena, ya que contiene una base no de 64 caracteres, más de dos caracteres de relleno, o no un carácter de espacio en blanco entre los caracteres de relleno».

En Servicio:

[WebGet(UriTemplate = "ReadFile/Convert", ResponseFormat = WebMessageFormat.Json)]  
public string ExportToExcel()
  {
      string filetoexport = "D:\\SomeFile.xls";
      byte[] data = File.ReadAllBytes(filetoexport);
      var s = Convert.ToBase64String(data);
      return s;
  }

En La Aplicación:

       var client = new RestClient("http://localhost:56877/User/");
       var request = new RestRequest("ReadFile/Convert", RestSharp.Method.GET);
       request.AddHeader("Accept", "application/Json");
       request.AddHeader("Content-Type", "application/Json");
       request.OnBeforeDeserialization = resp => {resp.ContentType =    "application/Json";};
       var result = client.Execute(request);
       byte[] d = Convert.FromBase64String(result.Content); 
  • Probablemente esto tiene que ver con Encoding.
  • ¿Sabes lo no deseado «personajes» se insertan?
  • El código actualizado es útil. Ahora tenemos que ver la cadena que usted envíe (es decir, s en el servicio) y el contenido que se recibe (es decir,result.content. No es necesario publicar toda la cadena, sólo hasta el primer destrozado de caracteres (o, si eso aún es demasiado largo, algunos subcadenas que muestran lo que fue enviado y lo recibido).
  • sí, me di cuenta de que ‘/’ está siendo sustituidos con ‘\/’
  • Para la barra siendo sustituidos, es que en el crudo contenido HTML (Fiddler les dicen), o en result.Content? Que le dirá si el problema es con el servidor o en el cliente.
  • El error también puede estar relacionado con un relleno problema @véase : stackoverflow.com/a/50525594/5102373

InformationsquelleAutor Rohit Verma | 2013-02-27

8 Kommentare

  1. 65

    Comprobar si sus datos de la imagen contiene la información del encabezado al principio:

    imageCode = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...

    Esto hará que el error anterior.

    Acaba de quitar todo en la parte frontal de e incluyendo la primera coma, y usted es bueno ir.

    imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
    • Tenía exactamente este problema de alguna manera. La lógica es quitar todo después de , si data: está presente. Bam. Ahora trabajar.
    • var cleanerBase64 = imageCode.Substring(22); // eliminar datos:image/png;base64,
    • Sólo un poco de código para ayudar a…… si (esto.imageCode.Contiene(‘,’)) esto.imageCode = este.imageCode.Substring(este.imageCode.IndexOf(«,») + 1, este.imageCode.La longitud (este.imageCode.IndexOf(«,») + 1));
    • Me gustaría utilizar: .Split(‘,’)[1]
    • str.Substring(str.LastIndexOf(',') + 1) debe hacerlo.
  2. 62

    Muy posiblemente es conseguir convertir a una modificación de Base64, donde el + y / personajes se cambian a - y _. Ver http://en.wikipedia.org/wiki/Base64#Implementations_and_history

    Si ese es el caso, usted necesita para cambiar de nuevo:

    string converted = base64String.Replace('-', '+');
    converted = converted.Replace('_', '/');
    • Tengo este hecho ….Gracias a ti!! La sustitución de los personajes con los apropiados. Pero es esta una solución concreta ? me refiero a ¿cómo puedo garantizar que para todos los archivos que este va a ser el personaje para ser sustituido ?
    • No sé. Usted necesita saber dónde se encuentran esos caracteres están siendo cambiadas, y determinar si es probable el cambio de cualquier otro carácter. Yo no estoy familiarizado con RestSharp, por lo que no puede ofrecer ningún asesoramiento. Si mi respuesta ha respondido a su pregunta, es habitual que a la marca como el aceptado respuesta. (Haga clic en la marca de verificación junto a la respuesta de la izquierda.)
    • OMG Gracias! Este y agregar el relleno necesario «=» caracteres resuelto mi problema. El descifrar de la función en Azure Clave de Bóveda de la API de REST de las necesidades de este proceso y no el documento.
  3. 24

    Podemos eliminar innecesarios cadena de entrada en la parte delantera del valor.

    string convert = hdnImage.Replace("data:image/png;base64,", String.Empty);
    
    byte[] image64 = Convert.FromBase64String(convert);
    • Esta solución funcionó para mí. Pero esto es específicamente para imágenes en formato png. Es allí cualquier generalizada sintaxis que sustituye a todos los tipos de extensiones de imagen?
    • he leído tu comentario ahora. yo no intentar esto, pero usted puede usar este: hdnImage.Replace(«data:image/png;base64,», String.Vacío).Replace(«data:image/jpg;base64,», String.Vacío).Replace(«data:image/bmp;base64,», String.Vacío); de nuevo, no me trate de esta. por favor, probar y escribir para mí. voy a cambiar.
  4. 4

    Sólo en caso de que usted no sabe el tipo de imagen cargada, y que acaba usted necesita para eliminar su base64 encabezado:

     var imageParts = model.ImageAsString.Split(',').ToList<string>();
     //Exclude the header from base64 by taking second element in List.
     byte[] Image = Convert.FromBase64String(imageParts[1]);
  5. 3

    Ya está devolviendo una cadena JSON, que la cadena se incluyen las comillas de apertura y cierre en la cruda respuesta. Así que su respuesta debe probablemente se verá como:

    "abc123XYZ=="

    o lo que sea…Usted puede tratar de confirmar esto con Fiddler.

    Mi conjetura es que el result.Content es la materia prima de la cadena, incluyendo las comillas. Si ese es el caso, entonces result.Content será necesario deserializa antes de poder usarlo.

    • estás en lo correcto, esto incluye «» pero el punto aquí es que, aparte de la adición de estos comillas otros personajes también están siendo reemplazadas.
    • Deserializar que en una cadena JSON serializador tendrá cuidado tanto de las cotizaciones y el escape de barra diagonal. Escapar de su diagonales con una barra diagonal inversa es algo que algunas JSON serializadores hacer – con un deserializer se convertir \/ de nuevo en, simplemente, / de modo que usted consiga válido base-64. Puesto que usted está recibiendo JSON, siempre es una buena idea analizar ese JSON de forma correcta, incluso si es sólo una simple cadena.
  6. 3

    He preparado un contexto similar como usted la describe, y a los que me enfrentaba el mismo error. Me las arreglé para conseguir trabajo mediante la eliminación de la " desde el principio y el final de los contenidos y por la sustitución de \/ con /.

    Aquí está el fragmento de código:

    var result = client.Execute(request);
    var response = result.Content
        .Substring(1, result.Content.Length - 2)
        .Replace(@"\/","/");
    byte[] d = Convert.FromBase64String(response);

    Como una alternativa, usted podría considerar el uso de XML para el formato de la respuesta:

    [WebGet(UriTemplate = "ReadFile/Convert", ResponseFormat = WebMessageFormat.Xml)]  
    public string ExportToExcel() { //... }

    En el lado del cliente:

    request.AddHeader("Accept", "application/xml");
    request.AddHeader("Content-Type", "application/xml");
    request.OnBeforeDeserialization = resp => { resp.ContentType = "application/xml"; };
    
    var result = client.Execute(request);
    var doc = new System.Xml.XmlDocument();
    doc.LoadXml(result.Content);
    var xml = doc.InnerText;
    byte[] d = Convert.FromBase64String(xml);
  7. 0

    Como Alex Filipovici mencionado, se trata de una codificación incorrecta. El archivo que he leído en la era UTF-8-BOM y tiró el error anterior en Convert.FromBase64String(). Cambiar a UTF-8 hizo el trabajo sin problemas.

  8. 0

    Y a veces se inicia con comillas dobles,
    la mayoría de las veces cuando se llama a la API de dotNetCore 2 para obtener el archivo de

    string string64 = string64.Replace(@"""", string.Empty);
    byte[] bytes = Convert.ToBase64String(string64);
    • No se puede convertir de string byte[]

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea