2015-01-15 36 views
31

Tất cả các tài liệu hướng dẫn/hướng dẫn/câu hỏi về xử lý một tập tin được tải lên bằng FormData đến một handler ASP.NET WebAPI sử dụng MultipartFormDataStreamProvider để xử lý dòng nhiều phần dữ liệu để phân chia nó thành các trường mẫu có liên quan và các tập tin .WebAPI Tập tin tải lên - Nếu không có ghi tập tin vào đĩa

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

await Request.Content.ReadAsMultipartAsync(provider); 

foreach (MultipartFileData file in provider.FileData) 
{ 
    // File 
} 

Tuy nhiên, tệp sẽ tự động được ghi vào thư mục trong quá trình xử lý.

Có vẻ như rất nhiều rắc rối khi tôi chỉ có thể sử dụng HttpContext.Current.Request.Files[0].InputStream để truy cập luồng tệp đã cho trực tiếp trong bộ nhớ.

Làm cách nào để WebAPI có thể truy cập trực tiếp luồng tệp mà không cần chi phí IO sử dụng MultipartFormDataStreamProvider?

hướng dẫn chính thức: http://www.asp.net/web-api/overview/advanced/sending-html-form-data,-part-2

+1

Tôi nghĩ [Câu hỏi này] (http://stackoverflow.com/questions/19723064/webapi-formdata-upload-to-db-with -extra-parameters) nên trả lời nhu cầu của bạn. –

+0

Cảm ơn @JonSusiak - Tôi ước rằng tôi đã tìm thấy một vài giờ trước, tôi đã làm điều tương tự bằng cách kiểm tra mã nguồn hoặc 'MultipartFormDataStreamProvider' và sử dụng nhà cung cấp' MultipartStreamProvider' để cung cấp cho tôi tệp tải lên trong 'MemoryStream' thay vì ghi nó vào đĩa. Chỉ mới bắt đầu đăng câu trả lời. – simbolo

+0

@simbolo - tại sao ** không ** bạn sử dụng 'HttpContext.Current.Request.Files [0] .InputStream'? Bạn có thể giải thích bất lợi? – Merenzo

Trả lời

69

quyết:

Sử dụng đơn giản MultipartMemoryStreamProvider hiện có. Không yêu cầu các lớp hoặc nhà cung cấp tùy chỉnh. Điều này khác với duplicate question đã giải quyết giải pháp bằng cách viết một nhà cung cấp tùy chỉnh.

Sau đó, sử dụng nó trong một handler WebAPI như vậy:

public async Task<IHttpActionResult> UploadFile() 
{ 
    if (!Request.Content.IsMimeMultipartContent()) 
    { 
     return StatusCode(HttpStatusCode.UnsupportedMediaType); 
    }   

    var filesReadToProvider = await Request.Content.ReadAsMultipartAsync(); 

    foreach (var stream in filesReadToProvider.Contents) 
    { 
     var fileBytes = await stream.ReadAsByteArrayAsync(); 
    } 
} 
+0

Tôi có thể tìm IHttpActionResult ở đâu? – guiomie

+0

@guiomie google đơn giản: https://msdn.microsoft.com/en-us/library/system.web.http.ihttpactionresult(v=vs.118).aspx – simbolo

+0

Đã lưu ngày của tôi. Cảm ơn bạn – Mariusz

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