ASP.Net Web API RC: многостраничная загрузка файлов в Memorystream

Я пытаюсь сохранить (а) загруженный файл в базу данных /memystream, но я не могу понять это.

Все, что у меня есть сейчас, это:

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, но я не вижу, как это сделать.

Пожалуйста, помогите. Спасибо заранее!

Ответ 1

Содержимое многостраничного содержимого может быть прочитано в любой из конкретных реализаций абстрактного класса 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
       }
   });
}

Ответ 2

Вы можете использовать MultipartMemoryStreamProvider для своего сценария.

[ Обновлено] Заметил, что вы используете RC, я думаю, что MultipartMemoryStreamProvider был добавлен после RC и в настоящее время находится в RTM.