web-dev-qa-db-fra.com

L'entrée n'est pas une chaîne Base64 valide, car elle contient un caractère non 64 base.

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

L’exception que j’obtiens lors de la reconversion du flux en octets est “L’entrée n’est pas une chaîne valide en base 64, car elle contient un caractère autre que base 64, plus de deux les caractères de remplissage ”.

Au service:

[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;
  }

À la demande:

       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); 
58
Rohit Verma

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

Si c'est le cas, vous devez le rétablir:

string converted = base64String.Replace('-', '+');
converted = converted.Replace('_', '/');
51
Jim Mischel

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 incluant la première virgule, et vous êtes prêt à partir.

imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
49
bendecko

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

string convert = hdnImage.Replace("data:image/png;base64,", String.Empty);

byte[] image64 = Convert.FromBase64String(convert);
19
Hasan Tuna Oruç

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 " au début et à la fin du contenu et en remplaçant \/ par /.

Voici l'extrait de code:

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

Alternativement, vous pouvez envisager d’utiliser XML pour le format de réponse:

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

Du côté du 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.FromBase64String(xml);
3
Alex Filipovici

Comme vous renvoyez une chaîne au format 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.

À mon avis, le result.Content est la chaîne brute, y compris les guillemets. Si c'est le cas, result.Content devra être désérialisé avant de pouvoir l'utiliser.

2
Joe Enos

Juste au cas où vous ne connaissez pas le type d'image téléchargée et qu'il vous reste à supprimer son en-tête 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]);
1
Mahdi Alkhatib

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

0
testing

Et parfois, cela commençait par des guillemets, La plupart du temps, lorsque vous appelez l'API de dotNetCore 2 pour obtenir un fichier

string string64 = string64.Replace(@"""", string.Empty);
byte[] bytes = Convert.ToBase64String(string64);
0
user193679