2013-03-05 79 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