10

我正在尝试将(一个)上传的文件保存到数据库/内存流中,但我无法弄清楚。

我现在只有这个:

public Task<HttpResponseMessage> AnswerQuestion()
{
    if (!Request.Content.IsMimeMultipartContent())
    {
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
    }

    var root = HttpContext.Current.Server.MapPath("~/App_Data");
    var provider = new MultipartFormDataStreamProvider(root);

    var task = Request.Content.ReadAsMultipartAsync(provider).
        ContinueWith<HttpResponseMessage>(t =>
        {
            if (t.IsFaulted || t.IsCanceled)
            {
                Request.CreateErrorResponse(HttpStatusCode.InternalServerError, t.Exception);
            }

            foreach (var file in provider.FileData)
            {
                Trace.WriteLine(file.Headers.ContentDisposition.FileName);
                Trace.WriteLine("Server file path: " + file.LocalFileName);
            }
            return Request.CreateResponse(HttpStatusCode.OK);
        });

    return task;
}

但当然这只会将文件保存到特定位置。我想我必须使用从 MediaTypeFormatter 派生的自定义类才能将其保存到 MemoryStream,但我不知道该怎么做。

请帮忙。提前致谢!

4

2 回答 2

27

多部分内容可以读入抽象MultipartStreamProvider类的任何具体实现 - 请参阅http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/8fda60945d49#src%2fSystem.Net.Http.Formatting%2fMultipartStreamProvider.cs

这些都是:

- MultipartMemoryStreamProvider 
- MultipartFileStreamProvider 
- MultipartFormDataStreamProvider 
- MultipartRelatedStreamProvider

在你的情况下:

if (Request.Content.IsMimeMultipartContent())
{              
   var streamProvider = new MultipartMemoryStreamProvider();
   var task = Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith(t =>
   {
       foreach (var item in streamProvider.Contents)
       {
           //do something
       }
   });
}
于 2012-08-31T09:20:24.023 回答
3

您可以将MultipartMemoryStreamProvider用于您的场景。

[更新] 注意到您正在使用 RC,我认为 MultipartMemoryStreamProvider 是在 RC 之后添加的,目前处于 RTM 中。

于 2012-08-30T15:19:55.413 回答