Mam usługę REST, która odczytuje plik i wysyła go do innej aplikacji konsoli po przekonwertowaniu go na tablicę Byte, a następnie na ciąg Base64. Ta część działa, ale gdy ten sam strumień jest odbierany w aplikacji, jest manipulowany i nie jest już prawidłowym ciągiem Base64. Niektóre postacie śmieci są wprowadzane do strumienia.
Wyjątkiem odebranym podczas konwersji strumienia z powrotem na Byte jest
Dane wejściowe nie są prawidłowym ciągiem Base-64, ponieważ zawierają znak inny niż podstawowy 64, więcej niż dwa znaki uzupełniające lub znak inny niż biały znak wśród znaków uzupełniających
W służbie:
[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;
}
Przy aplikacji:
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
W usłudze) i odebraną zawartość (tjresult.content
. Nie musisz wysyłać całego ciągu, tylko do pierwszego zniekształconego znaku (lub, jeśli jest nadal za długi , podciągi, które pokazują, co zostało wysłane i co otrzymano)result.Content
? Dzięki temu dowiesz się, czy problem dotyczy serwera czy klienta.Odpowiedzi:
Sprawdź, czy dane obrazu zawierają informacje nagłówka na początku:
imageCode = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
Spowoduje to powyższy błąd.
Po prostu usuń wszystko przed i łącznie z pierwszym przecinkiem i gotowe.
imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
źródło
,
jakdata:
jest obecny. Bam. Teraz pracuje.str.Substring(str.LastIndexOf(',') + 1)
powinien to zrobić.Bardzo możliwe, że jest konwertowany do zmodyfikowanego Base64, w którym znaki
+
i/
są zmieniane na-
i_
. Zobacz http://en.wikipedia.org/wiki/Base64#Implementations_and_historyW takim przypadku musisz to zmienić z powrotem:
string converted = base64String.Replace('-', '+'); converted = converted.Replace('_', '/');
źródło
Możemy usunąć niepotrzebne ciągi wejściowe poprzedzające wartość.
string convert = hdnImage.Replace("data:image/png;base64,", String.Empty); byte[] image64 = Convert.FromBase64String(convert);
źródło
Na wypadek, gdybyś nie wiedział, jaki typ przesłanego obrazu, wystarczy usunąć jego
base64
nagłówek:var imageParts = model.ImageAsString.Split(',').ToList<string>(); //Exclude the header from base64 by taking second element in List. byte[] Image = Convert.FromBase64String(imageParts[1]);
źródło
Ponieważ zwracasz ciąg jako JSON, ten ciąg będzie zawierał cudzysłowy otwierające i zamykające w nieprzetworzonej odpowiedzi. Twoja odpowiedź powinna prawdopodobnie wyglądać następująco:
"abc123XYZ=="
czy cokolwiek ... Możesz spróbować to potwierdzić za pomocą Fiddlera.
Domyślam się, że
result.Content
jest to nieprzetworzony ciąg znaków zawierający cudzysłowy. W takim przypadkuresult.Content
konieczne będzie zdeserializowanie, zanim będzie można z niego korzystać.źródło
Ułożyłem podobny kontekst, jaki opisałeś, i napotkałem ten sam błąd. Udało mi się go uruchomić, usuwając
"
początek i koniec treści i zastępując\/
go/
.Oto fragment kodu:
var result = client.Execute(request); var response = result.Content .Substring(1, result.Content.Length - 2) .Replace(@"\/","/"); byte[] d = Convert.FromBase64String(response);
Alternatywnie możesz rozważyć użycie XML dla formatu odpowiedzi:
[WebGet(UriTemplate = "ReadFile/Convert", ResponseFormat = WebMessageFormat.Xml)] public string ExportToExcel() { //... }
Po stronie klienta:
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);
źródło
var spl = item.Split('/')[1]; var format =spl.Split(';')[0]; stringconvert=item.Replace($"data:image/{format};base64,",String.Empty);
źródło
Jak wspomniał Alex Filipovici, problemem było nieprawidłowe kodowanie. Plik, który wczytałem, był
UTF-8-BOM
i wrzuciłem powyższy błądConvert.FromBase64String()
. Zmiana naUTF-8
działała bez problemów.źródło
Usuń niepotrzebny ciąg za pomocą Regex
Regex regex=new Regex(@"^[\w/\:.-]+;base64,"); base64File=regex.Replace(base64File,string.Empty);
źródło
Czasami zaczęło się od podwójnych cudzysłowów, najczęściej podczas wywoływania API z dotNetCore 2 w celu pobrania pliku
string string64 = string64.Replace(@"""", string.Empty); byte[] bytes = Convert.ToBase64String(string64);
źródło
Prawdopodobnie ciąg byłby taki, jak ten
data:image/jpeg;base64,/9j/4QN8RXh...
Pierwszy split dla/
i otrzyma drugi token.var StrAfterSlash = Face.Split('/')[1];
Następnie podziel się
;
i zdobądź pierwszy token, który będzie formatem. W moim przypadku jest to jpeg.var ImageFormat =StrAfterSlash.Split(';')[0];
Następnie usuń wiersz
data:image/jpeg;base64,
dotyczący zebranego formatuCleanFaceData=Face.Replace($"data:image/{ImageFormat };base64,",string.Empty);
źródło
Otrzymuję ten błąd, ponieważ pole było varbinary w tabeli sqlserver zamiast varchar .
źródło