Tengo un servicio REST que lee un archivo y lo envía a otra aplicación de consola después de convertirlo en una matriz de bytes y luego en una cadena Base64. Esta parte funciona, pero cuando se recibe el mismo flujo en la aplicación, se manipula y ya no es una cadena Base64 válida. Algunos personajes basura se están introduciendo en la corriente.
La excepción recibida al convertir la transmisión de nuevo a Byte es
La entrada no es una cadena Base-64 válida, ya que contiene un carácter no base 64, más de dos caracteres de relleno o 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);
Encoding
.s
en el servicio) y el contenido que se recibe (es decirresult.content
, no necesitas publicar toda la cadena, solo hasta el primer carácter mutilado (o, si aún es demasiado largo) , algunas subcadenas que muestran lo que se envió y lo que se recibió)result.Content
? Eso le dirá si el problema está en el servidor o en el cliente.Respuestas:
Verifique si los datos de su imagen contienen información de encabezado al principio:
imageCode = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
Esto provocará el error anterior.
Simplemente elimine todo lo que esté delante de la primera coma incluida, y listo.
imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
fuente
,
sidata:
está presente. Bam. Trabajando ahora.str.Substring(str.LastIndexOf(',') + 1)
Deberías hacerlo.Es muy posible que se convierta en un Base64 modificado, donde los caracteres
+
y/
se cambian a-
y_
. Ver http://en.wikipedia.org/wiki/Base64#Implementations_and_historySi ese es el caso, debe volver a cambiarlo:
string converted = base64String.Replace('-', '+'); converted = converted.Replace('_', '/');
fuente
Podemos eliminar la entrada de cadena innecesaria delante del valor.
string convert = hdnImage.Replace("data:image/png;base64,", String.Empty); byte[] image64 = Convert.FromBase64String(convert);
fuente
En caso de que no sepa el tipo de imagen cargada, y solo necesita 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]);
fuente
Dado que está devolviendo una cadena como JSON, esa cadena incluirá las comillas de apertura y cierre en la respuesta sin procesar. Entonces, su respuesta probablemente debería verse así:
"abc123XYZ=="
o lo que sea ... Puedes intentar confirmar esto con Fiddler.
Supongo que
result.Content
es la cadena sin formato, incluidas las comillas. Si ese es el caso,result.Content
será necesario deserializarlo antes de poder usarlo.fuente
Arreglé un contexto similar al que describiste y enfrenté el mismo error. Logré que funcionara eliminando el
"
del principio y el final del contenido y reemplazándolo\/
por/
.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, podría considerar usar XML para el formato de respuesta:
[WebGet(UriTemplate = "ReadFile/Convert", ResponseFormat = WebMessageFormat.Xml)] public string ExportToExcel() { //... }
Del 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);
fuente
var spl = item.Split('/')[1]; var format =spl.Split(';')[0]; stringconvert=item.Replace($"data:image/{format};base64,",String.Empty);
fuente
Eliminar la cadena innecesaria a través de Regex
Regex regex=new Regex(@"^[\w/\:.-]+;base64,"); base64File=regex.Replace(base64File,string.Empty);
fuente
Como mencionó Alex Filipovici, el problema era una codificación incorrecta. El archivo que leí era
UTF-8-BOM
y arrojé el error anteriorConvert.FromBase64String()
. El cambio aUTF-8
funcionó sin problemas.fuente
Y algunas veces comenzó con comillas dobles, la mayoría de las veces cuando llama a API desde dotNetCore 2 para obtener el archivo
string string64 = string64.Replace(@"""", string.Empty); byte[] bytes = Convert.ToBase64String(string64);
fuente
Probablemente la cadena sería así
data:image/jpeg;base64,/9j/4QN8RXh...
Primero dividir/
y obtener el segundo token.var StrAfterSlash = Face.Split('/')[1];
Luego, divida
;
y obtenga el primer token que será el formato. En mi caso es jpeg.var ImageFormat =StrAfterSlash.Split(';')[0];
Luego elimine la línea
data:image/jpeg;base64,
para el formato recopiladoCleanFaceData=Face.Replace($"data:image/{ImageFormat };base64,",string.Empty);
fuente