2013-03-05 100 views
0

我正在嘗試寫一個接受圖像的http服務器。我設法通過這種方式傳輸txt文件或簡單文本。但是,當涉及到JPEG文件,被轉移的人變得無法訪問。通過http發送jpg文件

客戶端:

 WebRequest request = WebRequest.Create("http://localhost:8080"); 
     request.Method = "POST"; 
     byte[] byteArray = System.IO.File.ReadAllBytes(path); 
     request.ContentType = "image/jpeg"; 
     request.ContentLength = byteArray.Length; 
     Stream dataStream = request.GetRequestStream(); 
     dataStream.Write(byteArray, 0, byteArray.Length); 
     dataStream.Close(); 

服務器端:

 HttpListenerContext context = listener.GetContext(); 
     HttpListenerRequest request = context.Request; 
     StreamReader reader = new StreamReader(request.InputStream,request.ContentEncoding); 
     Console.WriteLine("Client data content type {0}", request.ContentType); 
     String Data = reader.ReadToEnd(); 
     byte[] imagebuffer = System.Text.Encoding.UTF8.GetBytes(Data); 
     System.IO.File.WriteAllBytes(path, imagebuffer); 

當我嘗試這與.txt文件,字節數組的每邊長不改變和服務器端文件可讀。但使用jpg,數組長度是不同的。我想這是造成這個問題。我能做些什麼來避免這種情況?還是有其他選擇嗎?

編輯:用「BinaryReader」替換「StreamReader」,現在工作正常。好像;

 BinaryReader reader = new BinaryReader(request.InputStream, request.ContentEncoding); 
     byte[] imagebuffer = reader.ReadBytes((int)request.ContentLength64); 
     System.IO.File.WriteAllBytes(path, imagebuffer); 
+0

[「John Saunders編輯了你的標題,請參閱」應該在標題中包含「標籤嗎?」,其中的共識是「不,他們不應該」。/questions/15214204/return-different-lists-for-each-key#comment21443674_15214204) – 2013-03-05 02:47:52

回答

2

二進制數據的HTTP post傳輸二進制數據,而不是字符串。您的服務器端代碼錯誤地將JPG解析爲某種字符串。使用Stream對象並將流讀入字節數組而不使用StreamReader對象。

+0

感謝您的回答。 – aldewine 2013-03-05 03:06:14

-1

我相信你想要將二進制流轉換爲Base64編碼的字符串,然後從服務器上獲取字節。

客戶

var jpgBytes = File.ReadAllBytes(path); 
var encodedString = Convert.ToBase64String(jpgBytes); 
var encodedBytes = new byte[encodedString.Length * sizeof(char)]; 
System.Buffer.BlockCopy(encodedString.ToCharArray(), 0, bytes, 0, bytes.Length); 

var requestStream = request.GetRequestStream(); 
requestStream.Write(encodedBytes, 0, encodedBytes.length); 

服務器

var reader = new StreamReader(request.InputStream,request.ContentEncoding); 
var base64String = reader.ReadToEnd(); 
var jpg = Convert.FromBase64String(base64String); 
+1

這是不必要的,因爲HTTP支持二進制文件的傳輸。應該不涉及base64。 – Vetsin 2013-03-05 02:49:08

0

你用UTF8編碼它破壞數據。這不是使用字符串的地方。

服務器應首先驗證ContentLength標頭,然後使用BinaryReader.ReadBytesStream.Read讀取很多字節。儘管如此,一定要尋找例外情況,以防事情不匹配。

作爲另一個提示,我建議讓服務器讀取數據塊(一次幾千字節),而不是試圖在寫入磁盤之前將所有數據存儲在內存中。你永遠不知道可以上傳多大的文件。

+0

謝謝你解決你的建議。 – aldewine 2013-03-05 03:08:31