我的客户端上传代码:
using (var client = new HttpClient(new HttpClientHandler { AutomaticDecompression = System.Net.DecompressionMethods.GZip |
System.Net.DecompressionMethods.Deflate,MaxRequestContentBufferSize=int.MaxValue }))
{
HttpResponseMessage res;
if (App._StorageFile != null)
{
StorageFile _storageFile = App._StorageFile;
string fileName = _storageFile.Name;
IRandomAccessStream readStream = await _storageFile.OpenAsync(FileAccessMode.Read);
Stream stream = readStream.AsStreamForRead();
MultipartFormDataContent form = new MultipartFormDataContent();
StreamContent streamContent = new StreamContent(stream, (int)readStream.Size);
streamContent.Headers.ContentType = new MediaTypeHeaderValue(FileOperate.GetContentType(fileName));
streamContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data");
streamContent.Headers.ContentDisposition.Name = "file";
streamContent.Headers.ContentDisposition.FileName = fileName;
streamContent.Headers.ContentLength = (long)readStream.Size;
form.Add(streamContent);
HttpRequestMessage requestMsg = new HttpRequestMessage();
requestMsg.Content = streamContent;
requestMsg.Content.Headers.ContentType = new MediaTypeHeaderValue("multipart/form-data");
requestMsg.Method = new HttpMethod("POST");
requestMsg.RequestUri = new Uri(api);
res = await client.SendAsync(requestMsg);//以异步操作将Get请求发送给指定URI
}
else
{
res = await client.GetAsync(api);//以异步操作将Get请求发送给指定URI
}
服务器端获取文件代码:
if (System.Web.HttpContext.Current.Request.Files.Count > 0)
{
}
客户端提交的参数都可以正常获取,唯独System.Web.HttpContext.Current.Request.Files.Count的值总是为0,不知为什么,请大牛指教,万分感谢!
因为你没把 Count 传上去。
不是有个 WebClient 可以直接 UploadFile 吗?你可以通过抓包看看它是如何把 Count 属性写在 header里的。
在win8中是使用httpClient替代webClient的,另外不知你说的Count指的是什么,是不是文件的数量?我查看了一下,streamContent.Headers中没有 Count属性
@xiaofoyuan: 我知道没有。我的意思是在HTTP协议中,总会有一个地方需要把上传文件的个数记录下来传给服务器,很有可能是一个或多个Header 标记,以表示POST的是文件,并且有几个。你可以抓包看下使用 WebClient上传2个文件时,HTTP请求的HEADERS里面都有些什么。
@Launcher: 这个问题不再纠结了,我改用httpWebRquest可以正常发送和就收数据了,感谢您的指教!
@xiaofoyuan: 你好,我最近也在做类似的功能, Win8有很多方式实现post multipart请求, 我都试了上文的方法和自己构造httprequest请求, 都有一些小错误。 不知可否共享一下你的实现代码以供参考?
HttpRequestMessage后面的改成
var client = new HttpClient();
var response = await client.PostAsync(new Uri(api), form);