2013-02-27 71 views
48

我有一個REST服務,它讀取文件並將它轉換爲Byte數組,然後轉換爲Base64字符串後發送到另一個控制檯應用程序。這部分正確發生,但是當應用程序接收到相同的流時,它會被操縱,並且不再是有效的Base64字符串。一些垃圾字符正在引入流中。輸入不是有效的Base-64字符串,因爲它包含非基本64字符

將流轉換回字節時得到的異常是「輸入不是有效的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); 
+4

這大概與'Encoding'做。 – 2013-02-27 14:08:09

+1

你知道什麼「垃圾字符」被插入嗎? – 2013-02-27 14:10:14

+0

更新的代碼很有幫助。現在我們需要看到你發送的字符串(即服務上的's')和接收到的內容(即'result.content')。你不需要發佈整個字符串,直到第一個被修改的字符(或者,如果這還太長,一些子字符串會顯示發送的內容和接收到的內容) – 2013-02-27 14:21:50

回答

45

很可能它變得轉化爲經修飾的Base64,其中+/字符被改變爲-_ 。見http://en.wikipedia.org/wiki/Base64#Implementations_and_history

如果是這樣的話,你需要將它改回來:

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

我得到了這個完成....感謝你! ! 用適當的替換字符但這是一個具體的解決方案嗎?我的意思是我怎樣才能保證所有的文件將被替換的字符? – 2013-02-27 14:52:07

+1

@RohitVerma:我不知道,你需要找出那些角色得到的地方改變,並確定是否可能改變任何其他角色。我對RestSharp不熟悉,所以我不能在那裏提供任何建議。如果我的回答回答您的問題,習慣上將其標記爲接受的答案。 (點擊左邊答案旁邊的複選標記。) – 2013-02-27 15:14:11

1

既然你返回一個字符串作爲JSON,該字符串將包括原始響應開閉引號。所以,你的反應或許應該是這樣的:

"abc123XYZ==" 

或任何...您可以嘗試使用Fiddler證實這一點。

我的猜測是result.Content是原始字符串,包括引號。如果是這種情況,那麼result.Content需要反序列化,然後才能使用它。

+0

你是對的,這包括「」,但這裏要指出的是除了這些引號之外,其他字符也被替換。 – 2013-02-27 14:57:47

+0

使用JSON序列化程序反序列化該字符串將處理引號和轉義斜線。使用反斜槓轉義反斜槓是某些JSON序列化器所做的 - 使用反序列化器會將\ \轉回爲普通/,以便獲得有效的base-64。既然您收到JSON,那麼正確解析JSON總是一個好主意,即使它只是一個簡單的字符串。 – 2013-02-27 16:32:58

3

我安排了與您所描述的類似的上下文,並且我面臨同樣的錯誤。我設法通過從內容的開頭和結尾刪除"並通過用/替換\/來實現它。

這裏是代碼片段:

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

檢查您的圖像數據是否包含一些標題信息:

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

這將導致上述錯誤。

只要刪除包括第一個逗號前面的所有內容,然後您就可以繼續。

imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC... 
+0

有某種確切的問題。如果'data:'存在,邏輯就是在','後面刪除所有內容。巴姆。現在工作。 – 2016-06-14 13:14:26

13

我們可以在值前面刪除不必要的字符串輸入。

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

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

該解決方案適用於我。但這是專門爲PNG圖像。是否有任何通用的語法來替代各種圖像擴展? – 2016-09-01 07:25:08

+0

我現在閱讀您的評論。我不試試這個,但你可以使用這個:hdnImage.Replace(「data:image/png; base64,」,String.Empty).Replace(「data:image/jpg; base64,」,String.Empty).Replace 「data:image/bmp; base64,」,String.Empty);再次,我不試試這個。請嘗試爲我寫信。我會改變。 – 2016-09-05 11:32:08

1

以防萬一你不知道上傳的圖片的類型,你只需要刪除其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]); 
+0

拆分和列表?使用寧可IndexOf和子串 – 2018-01-18 09:03:02

+0

@EmmanuelGleizer更有效率嗎? – 2018-01-18 16:24:41

+0

看到http://demeranville.com/battle-of-the-tokenizers-delimited-text-parser-performance/和問題也張貼在這裏:https://stackoverflow.com/questions/35388181/split-method- VS-子和-的indexOf – 2018-01-25 07:51:54

相關問題