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);
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('_', '/');
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...
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);
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);
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.
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]);
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.
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);