У меня есть служба REST, которая читает файл и отправляет его в другое консольное приложение после преобразования его в массив байтов, а затем в строку Base64. Эта часть работает, но когда тот же поток поступает в приложение, он обрабатывается и больше не является допустимой строкой Base64. Некоторые нежелательные символы попадают в поток.
Исключение, полученное при преобразовании потока обратно в байтовый, -
Ввод не является допустимой строкой Base-64, так как он содержит символ, отличный от base 64, более двух символов заполнения или символ, не являющийся пробелом, среди символов заполнения
В службе:
[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;
}
В приложении:
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
Е. В службе), и полученный контент (тresult.content
. Е. Вам не нужно публиковать всю строку, только до первого искаженного символа (или, если он все еще слишком длинный) , некоторые подстроки, которые показывают, что было отправлено и что было получено)result.Content
? Это скажет вам, связана ли проблема с сервером или клиентом.Ответы:
Проверьте, содержат ли данные вашего изображения некоторую информацию заголовка в начале:
imageCode = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
Это вызовет указанную выше ошибку.
Просто удалите все перед первой запятой включительно, и все готово.
imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
источник
,
еслиdata:
присутствует. Бам. Работаю сейчас.str.Substring(str.LastIndexOf(',') + 1)
должен это сделать.Очень возможно , это получение преобразуется в модифицированном Base64, где
+
и/
символы заменяются на-
и_
. См. Http://en.wikipedia.org/wiki/Base64#Implementations_and_historyЕсли это так, вам нужно изменить его обратно:
string converted = base64String.Replace('-', '+'); converted = converted.Replace('_', '/');
источник
Мы можем удалить ненужный строковый ввод перед значением.
string convert = hdnImage.Replace("data:image/png;base64,", String.Empty); byte[] image64 = Convert.FromBase64String(convert);
источник
На всякий случай, если вы не знаете тип загруженного изображения, и вам просто нужно удалить его
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]);
источник
Поскольку вы возвращаете строку как JSON, эта строка будет включать открывающую и закрывающую кавычки в необработанном ответе. Ваш ответ, вероятно, должен выглядеть так:
"abc123XYZ=="
или что-то еще ... Вы можете попробовать подтвердить это с помощью Fiddler.
Я предполагаю, что
result.Content
это необработанная строка, включая кавычки. В этом случаеresult.Content
перед использованием необходимо выполнить десериализацию.источник
Я организовал аналогичный контекст, как вы описали, и столкнулся с той же ошибкой. Мне удалось заставить его работать, удалив в
"
начале и в конце контента и заменив\/
на/
.Вот фрагмент кода:
var result = client.Execute(request); var response = result.Content .Substring(1, result.Content.Length - 2) .Replace(@"\/","/"); byte[] d = Convert.FromBase64String(response);
В качестве альтернативы вы можете рассмотреть возможность использования XML для формата ответа:
[WebGet(UriTemplate = "ReadFile/Convert", ResponseFormat = WebMessageFormat.Xml)] public string ExportToExcel() { //... }
На стороне клиента:
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);
источник
var spl = item.Split('/')[1]; var format =spl.Split(';')[0]; stringconvert=item.Replace($"data:image/{format};base64,",String.Empty);
источник
Удаляем ненужную строку через Regex
Regex regex=new Regex(@"^[\w/\:.-]+;base64,"); base64File=regex.Replace(base64File,string.Empty);
источник
Как сказал Алекс Филиповичи, проблема заключалась в неправильной кодировке. Файл, который я прочитал, был
UTF-8-BOM
и вызвал вышеуказанную ошибкуConvert.FromBase64String()
. Переход наUTF-8
действительно работал без проблем.источник
И иногда это начиналось с двойных кавычек, в большинстве случаев, когда вы вызываете API из dotNetCore 2 для получения файла
string string64 = string64.Replace(@"""", string.Empty); byte[] bytes = Convert.ToBase64String(string64);
источник
Вероятно, строка будет такой, как эта
data:image/jpeg;base64,/9j/4QN8RXh...
Первая разделить/
и получить второй токен.var StrAfterSlash = Face.Split('/')[1];
Затем разделите на
;
и получите первый токен, который будет форматом. В моем случае это jpeg.var ImageFormat =StrAfterSlash.Split(';')[0];
Затем удалите строчку
data:image/jpeg;base64,
для собранного форматаCleanFaceData=Face.Replace($"data:image/{ImageFormat };base64,",string.Empty);
источник