L’entrée n’est pas une chaîne Base-64 valide car elle contient un caractère 64 non-base

J’ai un service REST qui lit un fichier et l’envoie à une autre application de console après l’avoir converti en tableau d’octets, puis en chaîne Base64. Cette partie est correcte, mais lorsque le même stream est reçu à l’application, il est manipulé et n’est plus une chaîne Base64 valide. Certains caractères indésirables sont introduits dans le stream.

L’exception que j’obtiens lors de la conversion du stream en octet est la suivante: «L’entrée n’est pas une chaîne Base-64 valide car elle contient un caractère 64 non-base, plus de deux caractères de remplissage ou un espace non blanc dans le remplissage. personnages » .

Au service:

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

À l’application:

  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.FromBase64Ssortingng(result.Content); 

Très probablement, il est converti en un Base64 modifié, où les caractères + et / sont remplacés par - et _ . Voir http://en.wikipedia.org/wiki/Base64#Implementations_and_history

Si tel est le cas, vous devez le changer:

 ssortingng converted = base64Ssortingng.Replace('-', '+'); converted = converted.Replace('_', '/'); 

Vérifiez si vos données d’image contiennent des informations d’en-tête au début:

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

Cela provoquera l’erreur ci-dessus.

Supprimez tout ce qui se trouve devant et y compris la première virgule, et vous êtes prêt à partir.

 imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC... 

Nous pouvons supprimer les entrées de chaînes inutiles devant la valeur.

 ssortingng convert = hdnImage.Replace("data:image/png;base64,", Ssortingng.Empty); byte[] image64 = Convert.FromBase64Ssortingng(convert); 

J’ai organisé un contexte similaire à celui que vous avez décrit et j’ai fait face à la même erreur. J’ai réussi à le faire fonctionner en supprimant le " du début et de la fin du contenu et en remplaçant \/ par / .

Voici l’extrait de code:

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

Comme alternative, vous pourriez envisager d’utiliser XML pour le format de réponse:

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

Côté client:

 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.FromBase64Ssortingng(xml); 

Puisque vous retournez une chaîne en tant que JSON, cette chaîne inclura les guillemets d’ouverture et de fermeture dans la réponse brute. Donc, votre réponse devrait probablement ressembler à ceci:

 "abc123XYZ==" 

ou peu importe … Vous pouvez essayer de confirmer cela avec Fiddler.

Je suppose que le result.Content est la chaîne brute, y compris les guillemets. Si c’est le cas, alors result.Content devra être désérialisé avant de pouvoir l’utiliser.

Juste au cas où vous ne connaissez pas le type d’image téléchargée, et que vous devez simplement supprimer son en-tête base64 :

  var imageParts = model.ImageAsSsortingng.Split(',').ToList(); //Exclude the header from base64 by taking second element in List. byte[] Image = Convert.FromBase64Ssortingng(imageParts[1]); 

Comme Alex Filipovici a mentionné que le problème était un mauvais encodage. Le fichier que j’ai lu était UTF-8-BOM et Convert.FromBase64Ssortingng() erreur ci-dessus sur Convert.FromBase64Ssortingng() . Passer à UTF-8 a fonctionné sans problème.