通过Http发送jpg文件

时间:2013-03-05 02:38:51

标签: c# http post request jpeg

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

服务器应首先验证ContentLength标头,然后使用BinaryReader.ReadBytesStream.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);