Ввод не является допустимой строкой Base-64, так как он содержит не-базовый символ 64
У меня есть служба REST, которая читает файл и отправляет его в другое консольное приложение после преобразования его в массив байтов, а затем в строку Base64. Эта часть выполняется правильно, но когда тот же поток принимается в приложении, он обрабатывается и больше не является допустимой строкой Base64. Некоторые нежелательные символы вводятся в поток.
Исключением, которое я получаю при преобразовании потока обратно в байты, является . Вход не является допустимой строкой Base-64, так как он содержит не-базовый символ 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);
Ответы
Ответ 1
Возможно, он преобразуется в модифицированный Base64, где символы +
и /
изменены на -
и _
. См. http://en.wikipedia.org/wiki/Base64#Implementations_and_history
Если в этом случае вам нужно изменить его:
string converted = base64String.Replace('-', '+');
converted = converted.Replace('_', '/');
Ответ 2
Проверьте, содержат ли ваши данные изображения некоторую информацию заголовка в начале:
imageCode = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
Это приведет к вышеуказанной ошибке.
Просто удалите все перед первой запятой и включите ее, и вы хорошо пойдете.
imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
Ответ 3
Мы можем удалить ненужный ввод строки перед значением.
string convert = hdnImage.Replace("data:image/png;base64,", String.Empty);
byte[] image64 = Convert.FromBase64String(convert);
Ответ 4
Я устроил аналогичный контекст, как вы описали, и я столкнулся с той же ошибкой. Мне удалось заставить его работать, удалив "
с начала и конца содержимого и заменив \/
на /
.
Вот фрагмент кода:
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);
Ответ 5
Поскольку вы возвращаете строку как JSON, эта строка будет включать кавычки открытия и закрытия в исходном ответе. Поэтому ваш ответ должен выглядеть следующим образом:
"abc123XYZ=="
или что-то еще... Вы можете попробовать подтвердить это с помощью Fiddler.
Я предполагаю, что result.Content
является исходной строкой, включая кавычки. Если это случай, то result.Content
нужно будет десериализовать, прежде чем вы сможете его использовать.
Ответ 6
На всякий случай вы не знаете тип загруженного изображения, и вам просто нужно удалить его заголовок 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]);
Ответ 7
Как отметил Алекс Филипович, проблема была в неправильной кодировке. Файл, который я прочитал, был UTF-8-BOM
и выдал вышеуказанную ошибку на Convert.FromBase64String()
. Переход на UTF-8
работал без проблем.
Ответ 8
И иногда это начиналось с двойных кавычек, в большинстве случаев, когда вы вызываете API из dotNetCore 2
string string64 = string64.Replace(@"""", string.Empty);
byte[] bytes = Convert.ToBase64String(string64);