Saya memiliki layanan REST yang membaca file dan mengirimkannya ke aplikasi konsol lain setelah mengubahnya menjadi array Byte dan kemudian ke string Base64. Bagian ini berfungsi, tetapi ketika aliran yang sama diterima di aplikasi, itu akan dimanipulasi dan tidak lagi menjadi string Base64 yang valid. Beberapa karakter sampah diperkenalkan ke arus.
Pengecualian yang diterima saat mengubah aliran kembali ke Byte adalah
Input bukan string Base-64 yang valid karena berisi karakter non-base 64, lebih dari dua karakter padding, atau karakter non-spasi kosong di antara karakter padding
Di Layanan:
[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;
}
Di Aplikasi:
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
pada layanan) dan konten yang diterima (yaituresult.content
. Anda tidak perlu memposting seluruh string, cukup hingga karakter pertama yang rusak (atau, jika itu masih terlalu panjang , beberapa substring yang menunjukkan apa yang dikirim dan apa yang diterima).result.Content
? Itu akan memberi tahu Anda jika masalahnya ada pada server atau klien.Jawaban:
Periksa apakah data gambar Anda berisi beberapa informasi header di awal:
imageCode = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
Ini akan menyebabkan kesalahan di atas.
Hapus saja semua yang ada di depan dan termasuk koma pertama, dan Anda siap melakukannya.
imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
sumber
,
jikadata:
ada. Bam. Bekerja sekarang.str.Substring(str.LastIndexOf(',') + 1)
harus melakukannya.Sangat mungkin itu diubah menjadi Base64 yang dimodifikasi, di mana karakter
+
dan/
diubah menjadi-
dan_
. Lihat http://en.wikipedia.org/wiki/Base64#Implementations_and_historyJika demikian, Anda perlu mengubahnya kembali:
string converted = base64String.Replace('-', '+'); converted = converted.Replace('_', '/');
sumber
Kami dapat menghapus input string yang tidak perlu di depan nilai.
string convert = hdnImage.Replace("data:image/png;base64,", String.Empty); byte[] image64 = Convert.FromBase64String(convert);
sumber
Untuk berjaga-jaga jika Anda tidak tahu jenis gambar yang diunggah, dan Anda hanya perlu menghapus
base64
headernya:var imageParts = model.ImageAsString.Split(',').ToList<string>(); //Exclude the header from base64 by taking second element in List. byte[] Image = Convert.FromBase64String(imageParts[1]);
sumber
Karena Anda mengembalikan string sebagai JSON, string itu akan menyertakan tanda kutip pembuka dan penutup dalam respons mentah. Jadi tanggapan Anda mungkin akan terlihat seperti:
"abc123XYZ=="
atau apa pun ... Anda dapat mencoba mengonfirmasi ini dengan Fiddler.
Dugaan saya adalah bahwa
result.Content
string mentah, termasuk tanda kutip. Jika demikian, makaresult.Content
perlu dilakukan deserialisasi sebelum Anda dapat menggunakannya.sumber
Saya mengatur konteks yang sama seperti yang Anda jelaskan dan saya menghadapi kesalahan yang sama. Saya berhasil membuatnya berfungsi dengan menghapus
"
dari awal dan akhir konten dan dengan menggantinya\/
dengan/
.Berikut adalah cuplikan kodenya:
var result = client.Execute(request); var response = result.Content .Substring(1, result.Content.Length - 2) .Replace(@"\/","/"); byte[] d = Convert.FromBase64String(response);
Sebagai alternatif, Anda mungkin mempertimbangkan menggunakan XML untuk format respons:
[WebGet(UriTemplate = "ReadFile/Convert", ResponseFormat = WebMessageFormat.Xml)] public string ExportToExcel() { //... }
Di sisi klien:
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);
sumber
var spl = item.Split('/')[1]; var format =spl.Split(';')[0]; stringconvert=item.Replace($"data:image/{format};base64,",String.Empty);
sumber
Hapus string yang tidak perlu melalui Regex
Regex regex=new Regex(@"^[\w/\:.-]+;base64,"); base64File=regex.Replace(base64File,string.Empty);
sumber
Seperti yang dikatakan Alex Filipovici , masalahnya adalah pengkodean yang salah. File yang saya baca adalah
UTF-8-BOM
dan menampilkan kesalahan di atasConvert.FromBase64String()
. Mengubah menjadiUTF-8
berhasil tanpa masalah.sumber
Dan beberapa kali itu dimulai dengan tanda kutip ganda, sebagian besar saat Anda memanggil API dari dotNetCore 2 untuk mendapatkan file
string string64 = string64.Replace(@"""", string.Empty); byte[] bytes = Convert.ToBase64String(string64);
sumber
Mungkin stringnya akan seperti ini
data:image/jpeg;base64,/9j/4QN8RXh...
First split/
dan dapatkan token kedua.var StrAfterSlash = Face.Split('/')[1];
Kemudian Pisahkan
;
dan dapatkan token pertama yang akan menjadi formatnya. Dalam kasus saya, ini adalah jpeg.var ImageFormat =StrAfterSlash.Split(';')[0];
Kemudian hapus baris
data:image/jpeg;base64,
untuk format yang dikumpulkanCleanFaceData=Face.Replace($"data:image/{ImageFormat };base64,",string.Empty);
sumber