2013-02-27 22 views
48

Tôi có dịch vụ REST đọc tệp và gửi nó tới ứng dụng bảng điều khiển khác sau khi chuyển đổi thành mảng Byte và sau đó đến chuỗi Base64. Phần này xảy ra chính xác nhưng khi cùng một luồng được nhận tại ứng dụng, nó được xử lý và không còn là một chuỗi Base64 hợp lệ nữa. Một số ký tự rác đang được giới thiệu vào luồng.Đầu vào không phải là chuỗi Base-64 hợp lệ vì nó chứa một ký tự không phải là cơ sở 64

Ngoại lệ mà tôi nhận được khi chuyển đổi luồng ngược về Byte là “Dữ liệu nhập không phải là chuỗi Base-64 hợp lệ vì nó chứa ký tự không phải là 64, nhiều hơn hai ký tự đệm hoặc không trắng ký tự khoảng trắng giữa các ký tự đệm ”.

Tại dịch vụ:

[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; 
    } 

Tại Ứng dụng:

 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); 
+4

Có lẽ điều này đã làm với 'Encoding'. –

+1

Bạn có biết "ký tự rác" nào đang được chèn vào không? –

+0

Mã cập nhật hữu ích. Bây giờ chúng ta cần xem chuỗi mà bạn gửi (tức là 's' trên dịch vụ) và nội dung đã nhận được (tức là' result.content'. Bạn không cần phải đăng chuỗi toàn bộ, chỉ đến ký tự bị xé đầu tiên (hoặc, nếu vẫn còn quá dài, một số chất nền hiển thị nội dung được gửi và những gì đã nhận được) –

Trả lời

45

Rất có thể nó nhận được chuyển đổi sang một Base64 sửa đổi, nơi +/ nhân vật được thay đổi để -_ . Xem http://en.wikipedia.org/wiki/Base64#Implementations_and_history

Nếu đó là trường hợp, bạn cần phải thay đổi nó trở lại:

string converted = base64String.Replace('-', '+'); 
converted = converted.Replace('_', '/'); 
+0

Tôi đã thực hiện điều này .... Cảm ơn bạn! Thay thế các ký tự bằng các ký tự thích hợp.Nhưng đây có phải là giải pháp cụ thể không? I có nghĩa là làm thế nào tôi có thể đảm bảo rằng tất cả các tệp này sẽ là ký tự được thay thế? –

+1

@RohitVerma: Tôi không biết. tìm ra nơi các nhân vật đó nhận được ting đã thay đổi và xác định xem có khả năng thay đổi bất kỳ ký tự nào khác không. Tôi không quen thuộc với RestSharp, vì vậy tôi không thể đưa ra lời khuyên nào ở đó. Nếu câu trả lời của tôi trả lời câu hỏi của bạn, thông thường để đánh dấu câu hỏi đó là câu trả lời được chấp nhận. (Nhấp vào dấu kiểm bên cạnh câu trả lời ở bên trái.) –

1

Vì bạn đang trả lại một chuỗi như JSON, chuỗi mà sẽ bao gồm dấu ngoặc kép đóng mở và trong phản ứng thô. Vì vậy, phản hồi của bạn có thể trông giống như:

"abc123XYZ==" 

hoặc bất cứ điều gì ... Bạn có thể thử xác nhận điều này với Fiddler.

Tôi đoán là result.Content là chuỗi thô, bao gồm cả dấu ngoặc kép. Nếu trường hợp đó xảy ra, thì result.Content sẽ cần phải được deserialized trước khi bạn có thể sử dụng nó.

+0

bạn là chính xác, điều này bao gồm "" nhưng điểm ở đây là ngoài việc bổ sung các dấu ngoặc kép, các ký tự khác cũng được thay thế. –

+0

Deserializing chuỗi đó bằng cách sử dụng một serializer JSON sẽ chăm sóc cả hai dấu ngoặc kép và dấu gạch chéo thoát. Thoát dấu gạch chéo về phía trước của bạn bằng dấu gạch chéo ngược là thứ mà một số trình tuần tự JSON làm - bằng cách sử dụng trình khử giải sẽ biến \/trở lại thành chỉ đơn giản/sao cho bạn sẽ nhận được cơ sở hợp lệ 64. Vì bạn đang nhận JSON, nên luôn phân tích cú pháp JSON đúng cách, ngay cả khi nó chỉ là một chuỗi đơn giản. –

3

Tôi đã sắp xếp một ngữ cảnh tương tự như bạn đã mô tả và tôi gặp phải lỗi tương tự. Tôi đã cố gắng làm cho nó hoạt động bằng cách xóa " từ đầu và cuối nội dung và bằng cách thay thế \/ bằng /.

Dưới đây là đoạn mã:

var result = client.Execute(request); 
var response = result.Content 
    .Substring(1, result.Content.Length - 2) 
    .Replace(@"\/","/"); 
byte[] d = Convert.FromBase64String(response); 

Là một thay thế, bạn có thể xem xét sử dụng XML để định dạng phản ứng:

[WebGet(UriTemplate = "ReadFile/Convert", ResponseFormat = WebMessageFormat.Xml)] 
public string ExportToExcel() { //... } 

Về phía khách hàng:

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); 
34

Kiểm tra xem dữ liệu hình ảnh của bạn có chứa một số thông tin tiêu đề lúc đầu không:

imageCode = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC... 

Điều này sẽ gây ra lỗi trên.

Chỉ cần xóa mọi thứ ở phía trước và bao gồm dấu phẩy đầu tiên và bạn nên thực hiện.

imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC... 
+0

Có vấn đề chính xác này bằng cách nào đó. Logic là loại bỏ mọi thứ sau ',' nếu 'dữ liệu:' hiện diện. Bam. Đang làm việc. –

13

Chúng tôi có thể xóa đầu vào chuỗi không cần thiết trước giá trị.

string convert = hdnImage.Replace("data:image/png;base64,", String.Empty); 

byte[] image64 = Convert.FromBase64String(convert); 
+0

Giải pháp này làm việc cho tôi. Nhưng điều này đặc biệt cho hình ảnh png. Có bất kỳ cú pháp tổng quát nào thay thế tất cả các loại tiện ích mở rộng hình ảnh không? –

+0

tôi đã đọc nhận xét của bạn ngay bây giờ. Tôi không thử này nhưng bạn có thể sử dụng này: hdnImage.Replace ("dữ liệu: hình ảnh/png; base64,", String.Empty) .Replace ("dữ liệu: hình ảnh/jpg; base64,", String.Empty) .Replace ("data: image/bmp; base64,", String.Empty); một lần nữa, tôi không thử điều này. hãy thử và viết cho tôi. Tôi sẽ thay đổi. –

1

Chỉ trong trường hợp bạn không biết loại hình ảnh tải lên, và bạn chỉ cần bạn cần phải loại bỏ base64 tiêu đề của nó:

var imageParts = model.ImageAsString.Split(',').ToList<string>(); 
//Exclude the header from base64 by taking second element in List. 
byte[] Image = Convert.FromBase64String(imageParts[1]); 
+0

chia nhỏ và thành Danh sách? sử dụng thay vì IndexOf và chuỗi con –

+0

@EmmanuelGleizer có hiệu quả hơn không? –

+0

xem http://demeranville.com/battle-of-the-tokenizers-delimited-text-parser-performance/ và câu hỏi cũng được đăng ở đây: https://stackoverflow.com/questions/35388181/split-method- vs-substring-and-indexof –

Các vấn đề liên quan