积极答复者
windows8 app metro如何实现文件上传

问题
-
我的客户端上传代码:
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,不知为什么,请大牛指教,万分感谢!
答案
-
通过
Stream s = System.Web.HttpContext.Current.Request.InputStream; StreamReader reader = new StreamReader(s); string value = reader.ReadToEnd();
可以读取上传文件内容。
且基于流的POST传输,可以简单写为:
IRandomAccessStream readStream = await _storageFile.OpenAsync(FileAccessMode.Read); Stream stream = readStream.AsStream(); MultipartFormDataContent form = new MultipartFormDataContent(); StreamContent streamContent = new StreamContent(stream, (int)readStream.Size); form.Add(streamContent, "file", fileName); res = await client.PostAsync(api, form);
确实,他并没有标记填充Files集合,而只是将流内容Post。
这里,我们推荐使用后台传输来上传你的文件,而不是自己去实现HttpRequest ,请参考此文来设计后台上传文件http://msdn.microsoft.com/en-us/library/windows/apps/xaml/jj152727.aspx#prerequisites 例子:http://code.msdn.microsoft.com/windowsapps/Background-Transfer-Sample-d7833f61/
Bob Bao [MSFT]
MSDN Community Support | Feedback to us
- 已标记为答案 Jie BaoModerator 2012年9月24日 10:39
全部回复
-
可以参考一下我写的这段
//准备文件
Stream stream = await file.OpenStreamForReadAsync();
System.Net.Http.StreamContent contentFile = new System.Net.Http.StreamContent(stream);
contentFile.Headers.ContentLength = stream.Length;
//准备请求
System.Net.Http.MultipartFormDataContent contentMulti = new System.Net.Http.MultipartFormDataContent();
contentMulti.Add(contentFile, "uploadfile", "文件名.扩展名");System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();
await client.PostAsync(new Uri("url"), contentMulti);
-
通过
Stream s = System.Web.HttpContext.Current.Request.InputStream; StreamReader reader = new StreamReader(s); string value = reader.ReadToEnd();
可以读取上传文件内容。
且基于流的POST传输,可以简单写为:
IRandomAccessStream readStream = await _storageFile.OpenAsync(FileAccessMode.Read); Stream stream = readStream.AsStream(); MultipartFormDataContent form = new MultipartFormDataContent(); StreamContent streamContent = new StreamContent(stream, (int)readStream.Size); form.Add(streamContent, "file", fileName); res = await client.PostAsync(api, form);
确实,他并没有标记填充Files集合,而只是将流内容Post。
这里,我们推荐使用后台传输来上传你的文件,而不是自己去实现HttpRequest ,请参考此文来设计后台上传文件http://msdn.microsoft.com/en-us/library/windows/apps/xaml/jj152727.aspx#prerequisites 例子:http://code.msdn.microsoft.com/windowsapps/Background-Transfer-Sample-d7833f61/
Bob Bao [MSFT]
MSDN Community Support | Feedback to us
- 已标记为答案 Jie BaoModerator 2012年9月24日 10:39