2009-07-18 37 views
5

Tôi đang tải các tệp lớn lên máy chủ ASP.NET bằng cách sử dụng dữ liệu biểu mẫu nhiều phần đăng kiểm soát HTML tiêu chuẩn <input>. Đây là một ứng dụng ASP.NET MVC.Tại sao HttpPostedFile không thực hiện như quảng cáo và tải xuống bộ đệm cho đĩa thay vì bộ nhớ?

Theo MSDN, các HttpPostedFile đệm lớp vào đĩa ra khỏi hộp:

"Files được tải lên trong MIME nhiều phần dữ liệu định dạng/form-data By mặc định, tất cả các yêu cầu, bao gồm cả hình thức lĩnh vực. và các tệp đã tải lên, lớn hơn 256 KB được lưu vào đĩa, thay vì so với được lưu trữ trong bộ nhớ máy chủ ".

Tôi giả định này có nghĩa là khi tôi truy cập HttpPostedFileBase trong bộ điều khiển của tôi, khi tôi truy cập InputStream tài sản 's HttpPostedFileBase, tôi có thể ghi các bộ đệm tập tin ở đâu đó mà không cần phải lo lắng về các máy chủ đang chạy ra khỏi bộ nhớ, mà rõ ràng là một giải pháp không thể thực hiện được.

Dưới đây là một chút mã giả cho cách tôi xử lý từng tệp đến từ HttpPostedFileBase.

for(var i = 0; i< Request.Files.Count;i++) 
{ 
    var fileBase = Request.Files[i]; 
    if (fileBase.ContentLength == 0) 
    { 
     continue; 
    } 

    // One thread per file 
    ThreadPool.QueueUserWorkItem(state => 
    { 
     // Read from fileBase.InputStream 
    }, 
    null); 
} 

khối httpRuntime web.config của tôi trông như thế này:

<httpRuntime 
    executionTimeout="1200" 
    requestLengthDiskThreshold="2097151" 
    maxRequestLength="2097151" 
    useFullyQualifiedRedirectUrl="false" 
    minFreeThreads="8" 
    minLocalRequestFreeThreads="4" 
    appRequestQueueLimit="100" /> 

công trình thực hiện của tôi, nhiều tập tin được tải lên như mong đợi, ngoại trừ việc cùng một lượng bộ nhớ cần thiết để đệm toàn bộ tải trọng được tiêu thụ bởi máy chủ. Tôi phải giả định rằng InputStream đang đệm mọi thứ. Khi tôi tải lên nhiều tệp hơn tôi có bộ nhớ, nó có thể dự đoán bị lỗi với số OutOfMemoryException. Đây là một hình ảnh của bộ nhớ tăng đột biến khi tải lên một tệp 800mb.

alt text

Tôi biết tôi có thể sử dụng một widget Flash/Silverlight hoặc viết một tùy chỉnh HttpModule để đánh chặn cập nhật và xử lý bản thân mình, nhưng yêu cầu hiện tại sẽ làm việc một cách hoàn hảo nếu HttpPostedFile đã làm những gì MSDN nói nó (hoặc tôi đang làm sai).

Trả lời

5

tại sao bạn thiết lập

requestLengthDiskThreshold="2097151" 

trong cấu hình? Điều đó có buộc máy chủ phải giữ tất cả các tải lên trong RAM thay vì đệm vào đĩa không?

+0

Tất nhiên. Tôi đã gỡ lỗi một khía cạnh khác của việc tải lên và thiết lập mà không cần suy nghĩ. Thiết lập nó để 256kb giữ bộ nhớ máy chủ mà nó thuộc về. Cảm ơn! –

+0

@DanielCrenna bằng cách đặt nó thành 256kb bạn có thể tải lên thành công không? –