Eu tenho um serviço REST que lê um arquivo e o envia para outro aplicativo de console depois de convertê-lo em uma matriz de bytes e, em seguida, em uma string Base64. Essa parte funciona, mas quando o mesmo fluxo é recebido no aplicativo, ele é manipulado e não é mais uma string Base64 válida. Alguns personagens inúteis estão sendo introduzidos no fluxo.
A exceção recebida ao converter o fluxo de volta para Byte é
A entrada não é uma string Base-64 válida, pois contém um caractere não base 64, mais de dois caracteres de preenchimento ou um caractere de espaço não em branco entre os caracteres de preenchimento
Em serviço:
[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;
}
Na aplicação:
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
no serviço) e o conteúdo que é recebido (ou seja,result.content
você não precisa postar a string inteira, apenas até o primeiro caractere mutilado (ou, se ainda for muito longo , algumas substrings que mostram o que foi enviado e o que foi recebido.result.Content
? Isso dirá se o problema está no servidor ou no cliente.Respostas:
Verifique se os dados da imagem contêm algumas informações de cabeçalho no início:
imageCode = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
Isso causará o erro acima.
Basta remover tudo antes e inclusive a primeira vírgula, e pronto.
imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
fonte
,
sedata:
estiver presente. Bam. Trabalhando agora.str.Substring(str.LastIndexOf(',') + 1)
deve fazer isso.Muito provavelmente, ele está sendo convertido para um Base64 modificado, onde os caracteres
+
e/
são alterados para-
e_
. Consulte http://en.wikipedia.org/wiki/Base64#Implementations_and_historySe for esse o caso, você precisa alterá-lo de volta:
string converted = base64String.Replace('-', '+'); converted = converted.Replace('_', '/');
fonte
Podemos remover a entrada de string desnecessária na frente do valor.
string convert = hdnImage.Replace("data:image/png;base64,", String.Empty); byte[] image64 = Convert.FromBase64String(convert);
fonte
Para o caso de você não saber o tipo de imagem enviada, basta remover o
base64
cabeçalho:var imageParts = model.ImageAsString.Split(',').ToList<string>(); //Exclude the header from base64 by taking second element in List. byte[] Image = Convert.FromBase64String(imageParts[1]);
fonte
Como você está retornando uma string como JSON, essa string incluirá as aspas de abertura e fechamento na resposta bruta. Portanto, sua resposta provavelmente deve ser assim:
"abc123XYZ=="
ou qualquer coisa ... Você pode tentar confirmar isso com o Fiddler.
Meu palpite é que
result.Content
é a string bruta, incluindo as aspas. Se for esse o caso,result.Content
será necessário desserializar antes de poder usá-lo.fonte
Organizei um contexto semelhante ao que você descreveu e encontrei o mesmo erro. Consegui fazê-lo funcionar removendo o
"
do início e o fim do conteúdo e substituindo\/
por/
.Aqui está o snippet de código:
var result = client.Execute(request); var response = result.Content .Substring(1, result.Content.Length - 2) .Replace(@"\/","/"); byte[] d = Convert.FromBase64String(response);
Como alternativa, você pode considerar o uso de XML para o formato de resposta:
[WebGet(UriTemplate = "ReadFile/Convert", ResponseFormat = WebMessageFormat.Xml)] public string ExportToExcel() { //... }
Do lado do cliente:
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);
fonte
var spl = item.Split('/')[1]; var format =spl.Split(';')[0]; stringconvert=item.Replace($"data:image/{format};base64,",String.Empty);
fonte
Como Alex Filipovici mencionou, o problema era uma codificação errada. O arquivo que li era
UTF-8-BOM
e gerava o erro acimaConvert.FromBase64String()
. Mudar paraUTF-8
funcionou sem problemas.fonte
Remova a string desnecessária por meio do Regex
Regex regex=new Regex(@"^[\w/\:.-]+;base64,"); base64File=regex.Replace(base64File,string.Empty);
fonte
E algumas vezes começava com aspas duplas, na maioria das vezes quando você chama a API do dotNetCore 2 para obter o arquivo
string string64 = string64.Replace(@"""", string.Empty); byte[] bytes = Convert.ToBase64String(string64);
fonte
Provavelmente a string seria assim
data:image/jpeg;base64,/9j/4QN8RXh...
Primeira divisão para/
e obter o segundo token.var StrAfterSlash = Face.Split('/')[1];
Em seguida, divida
;
e obtenha o primeiro token, que será o formato. No meu caso, é jpeg.var ImageFormat =StrAfterSlash.Split(';')[0];
Em seguida, remova a linha
data:image/jpeg;base64,
para o formato coletadoCleanFaceData=Face.Replace($"data:image/{ImageFormat };base64,",string.Empty);
fonte
Recebo este erro porque um campo era varbinary na tabela sqlserver em vez de varchar .
fonte