以下代码能正常读取:
客户端:
byte[] buffer = new byte[fs.Length];//分配内存
fs.Read(buffer, 0,(int)fs.Length);//读文件
var v = Encoding.UTF8.GetBytes(Convert.ToBase64String(buffer));//编码 
var r = webClient.UploadData(url, "POST", v);//发送
服务端
System.IO.Stream s = h.Request.InputStream;//获取流
System.IO.StreamReader r = new System.IO.StreamReader(s,Encoding.UTF8);//解码
var v = (Convert.FromBase64String(r.ReadToEnd()));//读取
fs.Write(v, 0, v.Length);//写文件更改为以下代码时:
客户端:
byte[] buffer = new byte[fs.Length];//分配内存
fs.Read(buffer, 0,(int)fs.Length);//读文件 
var r = webClient.UploadData(url, "POST", buffer);//发送
服务端:
System.IO.Stream s = h.Request.InputStream;//获取流
byte[] buffer = new byte[s.Length];//分配内存(此处代码出现异常:该流无法查找操作)
S.Read(buffer, 0, buffer.Length)//
fs.Write(buffer, 0, buffer.Length);//写文件
会出现:该流无法查找操作。网上搜索了相关内容:
更改为一下代码:
服务端:
System.IO.Stream s = h.Request.InputStream;//获取流
BufferedStream bs = new BufferedStream(s);//转为内存流
byte[] buffer = new byte[1024];//分配内存
while ((i =bs.Read(buffer, 0, buffer.Length))>0) { fs.Write(buffer, 0, i); }//写文件(bs.Read读取返回值为0)
仍然有错误。求大神指教。谢谢! 

解决方案 »

  1.   

    该类型流对象不支持 s.Length 这种操作,那么你就不要用它。这怎么了?
      

  2.   

    通常,设计一个 OOAD 的系统,那么子类应该满足面向对象系统设计最基本的“里氏替换原则”,也就是说子类对象带入父类对象的早先的测试中应该是完美地支持的。但是现实是总会有些瑕疵,总是有一些古老的东西是子类抛出了异常而不支持父类接口的,这其实算是设计上的bug,但是(微软各种系统)已经持续支持了相关接口几十年也就保留了下来这些特性。
      

  3.   

    如果你要是想知道 r.ReadToEnd() 代码为什么能干净地读取输入流里边的文本,那么你就看看 ReadToEnd 的源代码!真正专业的程序员都是看 .net 源代码来学习的,只有业余爱好者才把 csdn 当作入门教程(csdn其实是技术、设计论坛,并不是免费教程)。
      

  4.   

    MemoryStream ms = new MemoryStream();
    h.Request.InputStream.CopyTo(ms);
    var buff = ms.ToArray();
    这样试试呢
      

  5.   


    首先谢谢大家的回复。关于楼上所说,Request.InputStream.改流下没有CopyTo的方法。请问何处有.ReadToEnd的源码呢?编译器只能看到定义
      

  6.   

    服务端:
    System.IO.Stream s = h.Request.InputStream;//获取流
    const int bufferLength = 1024;
    byte[] buffer = new byte[bufferLength ];//分配内存
    while ((i =s.Read(buffer, 0, bufferLength ))>0)
     { 
        fs.Write(buffer, 0, i); 
    }
      

  7.   

    你的这个“h”是HttpContext对象吗,如果是的话肯定有Copy方法啊