Подтвердить что ты не робот

Ввод не является допустимой строкой 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); 
4b9b3361

Ответ 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);