none
windows8 app metro如何实现文件上传 RRS feed

  • 问题

  • 我的客户端上传代码:
    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,不知为什么,请大牛指教,万分感谢!
    2012年9月14日 1:05

答案

  • 通过

    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

    2012年9月17日 4:09
    版主

全部回复

  • 可以参考一下我写的这段

     

                //准备文件
                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);

    2012年9月17日 3:39
  • 通过

    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

    2012年9月17日 4:09
    版主