2012-08-30 26 views
10

Tôi đang cố gắng lưu (một) tệp đã tải lên vào cơ sở dữ liệu/bộ nhớ, nhưng tôi không thể tìm ra.ASP .Net Web API RC: Multipart tải tập tin lên Memorystream

Tất cả tôi có ngay bây giờ là thế này:

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; 
} 

Nhưng tất nhiên điều này chỉ lưu các tập tin vào một vị trí cụ thể. Tôi nghĩ rằng tôi phải làm việc với một lớp tùy chỉnh có nguồn gốc từ MediaTypeFormatter để lưu nó vào một MemoryStream, nhưng tôi không thấy làm thế nào để làm điều đó.

Vui lòng trợ giúp. Cảm ơn trước!

Trả lời

26

Nội dung đa có thể được đọc vào bất kỳ triển khai cụ thể nào của lớp trừu tượng MultipartStreamProvider - xem http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/8fda60945d49#src%2fSystem.Net.Http.Formatting%2fMultipartStreamProvider.cs.

Đó là:

- MultipartMemoryStreamProvider 
- MultipartFileStreamProvider 
- MultipartFormDataStreamProvider 
- MultipartRelatedStreamProvider 

Trong trường hợp của bạn:

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

Liệu nó có nghĩa là nội dung của từng phần sẽ được nạp vào bộ nhớ? Nếu bạn có các tệp lớn đang được tải lên thì điều đó có nghĩa là bạn phải viết thực thi 'MultipartStreamProvider' của riêng mình? –

+2

Bit '// do something' trông như thế nào ...? – simonlchilds

3

Bạn có thể sử dụng MultipartMemoryStreamProvider cho kịch bản của mình.

[Cập nhật] Nhận thấy rằng bạn đang sử dụng RC, tôi nghĩ MultipartMemoryStreamProvider đã được thêm sau RC và hiện đang ở RTM.

Các vấn đề liên quan