0

我正在尝试编写一个接受图像的 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);
4

3 回答 3

2

二进制数据的 HTTP 发布传输二进制数据,而不是字符串。您的服务器端代码错误地将 JPG 解析为某种字符串。使用 Stream 对象并将流读入字节数组,而不使用 StreamReader 对象。

于 2013-03-05T02:47:44.267 回答
0

您通过使用 UTF8 对其进行编码来破坏数据。这不是使用字符串的地方。

服务器应首先验证 ContentLength 标头,然后使用BinaryReader.ReadBytes或读取那么多字节Stream.Read。不过,一定要寻找例外情况,以防事情不匹配。

作为另一个提示,我建议让服务器以块的形式(一次几千字节)读取数据,而不是在写入磁盘之前尝试将所有数据存储在内存中。您永远不知道可以上传多大的文件。

于 2013-03-05T03:03:23.097 回答
-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);
于 2013-03-05T02:47:56.263 回答