c# - una - frombase64string invalid length for a base 64 char array or string
La entrada no es una cadena Base-64 válida ya que contiene un carácter no base 64 (6)
Tengo un servicio REST que lee un archivo y lo envía a otra aplicación de consola luego de convertirlo a una matriz de bytes y luego a una cadena de Base64. Esta parte es correcta, pero cuando se recibe el mismo flujo en la aplicación, se manipula y ya no es una cadena Base64 válida. Algunos caracteres basura se están introduciendo en la transmisión.
La excepción que recibo al convertir la transmisión de nuevo a Byte es "La entrada no es una cadena válida Base-64, ya que contiene un carácter no base de 64, más de dos caracteres de relleno o un carácter de espacio no blanco entre el relleno personajes " .
En el 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);
Arreglé un contexto similar al que describiste y me enfrenté al mismo error. Logré ponerlo en funcionamiento eliminando "
desde el principio hasta el final del contenido y reemplazando //
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 alternativa, puede considerar usar XML para el formato de 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);
Como está devolviendo una cadena como JSON, esa cadena incluirá las comillas de apertura y cierre en la respuesta sin formato. Entonces su respuesta probablemente debería verse así:
"abc123XYZ=="
o lo que sea ... Puedes intentar confirmar esto con Fiddler.
Mi suposición es que el resultado. El result.Content
es la cadena en bruto, incluidas las comillas. Si ese es el caso, entonces result.Content
tendrá que ser deserializado antes de poder usarlo.
Comprueba si tus datos de imagen contienen alguna información de encabezado al principio:
imageCode = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
Esto causará el error anterior.
Simplemente elimine todo lo que está delante e incluya la primera coma, y listo.
imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
Muy posiblemente se está convirtiendo en un Base64 modificado, donde los caracteres +
y /
se cambian a -
y _
. Ver http://en.wikipedia.org/wiki/Base64#Implementations_and_history
Si ese es el caso, debe volver a cambiarlo:
string converted = base64String.Replace(''-'', ''+'');
converted = converted.Replace(''_'', ''/'');
Podemos eliminar la entrada de cadena innecesaria en frente del valor.
string convert = hdnImage.Replace("data:image/png;base64,", String.Empty);
byte[] image64 = Convert.FromBase64String(convert);
En caso de que no sepas el tipo de imagen cargada, solo debes quitar su encabezado base64
:
var imageParts = model.ImageAsString.Split('','').ToList<string>();
//Exclude the header from base64 by taking second element in List.
byte[] Image = Convert.FromBase64String(imageParts[1]);