我正在尝试编写一个接受图像的http服务器。我设法用这种方式传输txt文件或简单文本。但是当谈到jpeg文件时,转移的文件变得无法访问。
客户方:
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 :(得分:2)
二进制数据的HTTP帖子传输二进制数据,而不是字符串。您的服务器端代码错误地将JPG解析为某种字符串。使用Stream对象并在不使用StreamReader对象的情况下将流读入字节数组。
答案 1 :(得分:0)
您通过使用UTF8对数据进行编码来破坏数据。这不是使用字符串的地方。
服务器应首先验证ContentLength标头,然后使用BinaryReader.ReadBytes
或Stream.Read
读取那么多字节。但是,如果事情不匹配,请务必查找异常。
作为另一个提示,我建议让服务器以块(一次几千字节)读取数据,而不是在写入磁盘之前尝试将所有数据存储在内存中。你永远不知道文件的上传大小。
答案 2 :(得分:-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);