132 votes

L'entrée n'est pas une chaîne Base-64 valide car elle contient un caractère qui n'est pas de la base 64.

J'ai un service REST qui lit un fichier et l'envoie à une autre application console après l'avoir converti en tableau d'octets puis en chaîne Base64. Cette partie fonctionne, 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 caractères indésirables sont introduits dans le flux.

L'exception reçue lors de la reconversion du flux en octet est la suivante

L'entrée n'est pas une chaîne Base-64 valide car elle contient une chaîne non-base 64 plus de deux caractères de remplissage ou un caractère autre qu'un espace blanc. parmi 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;
  }

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

132voto

bendecko Points 174

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.

Il suffit de supprimer tout ce qui se trouve devant et y compris la première virgule, et c'est bon.

imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...

81voto

Jim Mischel Points 68586

Il est très possible qu'il soit converti en un Base64 modifié, où le caractère + y / Les caractères sont transformés en - y _ . Voir http://en.wikipedia.org/wiki/Base64#Implementations_and_history

Si c'est le cas, vous devez le changer à nouveau :

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

38voto

Hasan Tuna Oruç Points 389

Nous pouvons supprimer la saisie de chaînes inutiles devant la valeur.

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

byte[] image64 = Convert.FromBase64String(convert);

10voto

Amro Mustafa Points 214

Supprimez la chaîne inutile par Regex

Regex regex=new Regex(@"^[\w/\:.-]+;base64,");
base64File=regex.Replace(base64File,string.Empty);

6voto

Joe Enos Points 17442

Étant donné que vous renvoyez une chaîne en JSON, cette chaîne comprendra les guillemets ouvrants et fermants de la réponse brute. Donc votre réponse devrait probablement ressembler à :

"abc123XYZ=="

ou autre... Vous pouvez essayer de confirmer cela avec Fiddler.

Je pense 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ée avant que vous puissiez l'utiliser.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X