我是这样传递流的:
StreamReader sr = new StreamReader(openFileDialog1.FileName);
byte[] fileStream = Utility.ReadFully(sr.BaseStream);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(baseAddress));
request.Method = "POST";
request.ContentType = "application/octet-stream";
Stream serverStream = request.GetRequestStream();
serverStream.Write(fileStream, 0, fileStream.Length);
serverStream.Close();
HttpWebResponse response2 = (HttpWebResponse)request.GetResponse();
if (response2.StatusCode == HttpStatusCode.OK)
{
MessageBox.Show(Utility.ReadResponse(response2));
}
-------------------------------------------------------------------------
public static byte[] ReadFully(Stream input)
{
byte[] buffer = new byte[16 * 1024];
using (MemoryStream ms = new MemoryStream())
{
if (input != null)
{
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
}
return ms.ToArray();
}
}
然后在服务器上处理:
public bool UploadPhotoStream(string someStringParam, Stream fileData)
{
string filePath = string.Format("{0}/{1}", 'sdfgsdf87s7df8sd', '24asd54s4454d5f4g');
ProductPhoto newphoto = new ProductPhoto();
newphoto.FileSizeBytes = fileData.Length / 1024 / 1024;
newphoto.FileLocation = filePath;
...
}
现在我调用fileData.Length
时得到NotSupportedException
。我知道这是因为河流关闭了。但是我怎样才能重新打开它呢?或者,当我将流传递给服务时,我应该怎么做才能仍然获得它的长度?
为什么不传递content-length header呢?您的服务器可以检查报头并确切地知道正在发送的内容有多少字节。如何读取头取决于您使用的是哪个http框架,ASP。. NET Web Api,经典WCF Web Api, HttpListener等
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(baseAddress));
request.Method = "POST";
request.ContentType = "application/octet-stream";
request.ContentLength = new FileInfo(openFileDialog1.FileName).Length
如果没有Content-Length报头,http服务器永远不会知道还有多少字节需要读取。它只知道有一个流,并将读取它,直到没有更多的数据。这也是你的浏览器在下载某些东西时显示进度条的方式。
根据这篇文章:https://stackoverflow.com/a/8239268/1160036
你可以从你的web方法中像这样访问标题。
long dataLength = long.Parse(HttpContext.Current.Request.Headers["Content-Length"]);