2010-10-25 32 views
14

Chúng tôi muốn hạn chế kích thước tệp tải lên tối đa trong trang web của chúng tôi. Chúng tôi đã thiết lập các giới hạn thích hợp trong web.config của chúng tôi. Vấn đề chúng tôi gặp phải là nếu một tệp lớn thực sự (1 GB) được tải lên, toàn bộ toàn bộ tệp được tải lên trước khi lỗi máy chủ được tạo và loại lỗi khác nhau tập tin là rất lớn hay không.Ngăn tải lên các tệp lớn trong ASP.NET 4.0

Có cách nào để phát hiện kích thước tải lên tệp đang chờ xử lý trước khi quá trình tải lên thực sự diễn ra không?

Dưới đây là các thiết lập web.config có liên quan của tôi để hạn chế yêu cầu đến 16 MB:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.web> 
     <httpRuntime maxRequestLength="12288"/> 
    </system.web> 

    <system.webServer> 
     <security> 
      <requestFiltering> 
       <requestLimits maxAllowedContentLength="12582912"/> 
      </requestFiltering> 
     </security> 
    </system.webServer> 
</configuration> 

tôi đã cố gắng tạo ra một mô-đun HTTP để tôi có thể đánh chặn một yêu cầu sớm trong vòng đời yêu cầu, nhưng dường như cập nhật diễn ra ngay cả trước khi sự kiện BeginRequest của HttpApplication:

public class UploadModule : IHttpModule 
{ 
    private const int MaxUploadSize = 12582912; 

    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += handleBeginRequest; 
    } 

    public void Dispose() 
    { 
    } 

    private void handleBeginRequest(object sender, EventArgs e) 
    { 
     // The upload takes place before this method gets called. 

     var app = sender as HttpApplication; 

     if (app.Request.Files.OfType<HttpPostedFile>() 
      .Any(f => f.ContentLength > MaxUploadSize)) 
     { 
      app.Response.StatusCode = 413; 
      app.Response.StatusDescription = "Request Entity Too Large"; 
      app.Response.End(); 
      app.CompleteRequest(); 
     } 
    } 
} 

cập nhật:

Tôi biết rằng các công nghệ phía máy khách như Flash có thể phát hiện kích thước tệp trước khi tải lên nhưng chúng tôi cần giải pháp phía máy chủ vì chúng tôi muốn nhắm mục tiêu nền tảng không hỗ trợ Flash/Java/ActiveX/Silverlight. Tôi tin rằng IIS hoặc ASP.NET có một lỗi cho phép các tệp lớn được tải lên mặc dù giới hạn, vì vậy tôi đã gửi một lỗi here.

Tiện ích mở rộng ISAPI có cho phép tôi kiểm soát nhiều hơn việc xử lý yêu cầu hơn mô-đun HTTP và trình xử lý, chẳng hạn như cho phép tôi hủy tải lên nếu tiêu đề Nội dung có chiều dài lớn hơn giới hạn cho phép không?

Cập nhật 2:

Sigh. Microsoft đã đóng lỗi mà tôi đã gửi dưới dạng bản sao nhưng không cung cấp thêm thông tin nào. Hy vọng rằng họ không chỉ thả quả bóng này.

Cập nhật 3:

Hoan hô! Theo Microsoft:

Lỗi này đang được giải quyết vì nó đã được chuyển sang nhóm sản phẩm IIS. Nhóm IIS đã sửa lỗi này, lỗi này sẽ được đưa vào bản phát hành sau này của Windows.

+0

+1 về câu hỏi; quan tâm đến chủ đề này. Sự hiểu biết của tôi là bạn không thể làm bất cứ điều gì với nó cho đến khi toàn bộ yêu cầu đến, và chắc chắn mã bạn đang cố gắng sử dụng không có cách nào để biết trước. Tôi nghĩ rằng nó sẽ mất một cái gì đó trước đó trong đường ống yêu cầu; như ở phía máy khách, hoặc trước khi IIS/ASP.NET nhận được yêu cầu - như yêu cầu bắt đầu stream. –

+0

có thể bạn có thể tham khảo: http://stackoverflow.com/questions/14032918/setting-maxrequestlength -programmatically/14033087 # 14033087 –

Trả lời

2

Microsoft đã responded on their Microsoft Connect site như sau:

lỗi này đã được giải quyết như nó đã được chuyển giao cho các nhóm sản phẩm IIS. Nhóm IIS đã sửa lỗi này, lỗi này sẽ được đưa vào bản phát hành sau này của Windows.

Nếu bạn đang yêu cầu sửa chữa cho hệ điều hành hiện tại, yêu cầu QFE phải được mở. Vui lòng cho tôi biết nếu đây là tuyến đường bạn muốn đi. Xin lưu ý rằng việc mở một yêu cầu QFE không nhất thiết có nghĩa là nó sẽ được chấp thuận.

Vì vậy, tôi đoán chúng ta phải chờ phiên bản tiếp theo của IIS để khắc phục (trừ khi yêu cầu QFE được đáp ứng, bất kể là).

2

Có cách nào để phát hiện kích thước của một cấp phát tập tin tải lên trước upload thực tế diễn ra?

No. Điều đó sẽ yêu cầu quyền truy cập vào kích thước tệp trên máy khách. Việc cho phép máy chủ web truy cập trực tiếp vào các tệp trên máy khách sẽ có một chút nguy hiểm.

Đặt cược tốt nhất của bạn là đặt một dòng văn bản cho biết kích thước tệp tối đa được phép.

HOẶC bạn có thể tạo một số loại điều khiển ActiveX, applet java, v.v. để bạn không phụ thuộc vào các hạn chế của trình duyệt.Sau đó, bạn phải thuyết phục người dùng của bạn cài đặt nó. Có lẽ không phải là giải pháp tốt nhất.

+1

chính xác. nhưng phải có cách để phát hiện kích thước tệp đã tải lên trước khi toàn bộ tệp được tải lên ở phía máy chủ: chúng tôi có thể đọc tiêu đề "Nội dung dài" ngay sau khi tiêu đề yêu cầu được nhận và phân tích cú pháp (nhưng trước khi toàn bộ yêu cầu được xử lý). Tôi sẽ cập nhật điều này sau. –

+0

Ở đây: http://stackoverflow.com/questions/14032918/setting-maxrequestlength-programmatically/14033087#14033087 –

2

Sự cố là quá trình tải lên xảy ra cùng một lúc bằng yêu cầu Đăng bài HTTP để bạn chỉ có thể phát hiện sau khi hoàn tất.

Nếu bạn muốn kiểm soát nhiều hơn điều này, bạn nên dùng thử các tiện ích tải lên dựa trên Flash có nội dung này và hơn thế nữa. Kiểm tra liên kết này http://www.ajaxline.com/10-most-interesting-upload-widgets

+1

Bạn làm cho nó âm thanh như thế này là một hạn chế cơ bản trong HTTP, nơi nó thực sự là một hạn chế trong phần mềm máy chủ web. – Charlie

0

Vâng .... Phụ thuộc vào mức độ thấp bạn muốn nhận.

Tạo ứng dụng dịch vụ hoạt động như proxy cho IIS. (Tất cả các yêu cầu ổ cắm cổng 80 đến đến dịch vụ.) Có dịch vụ chuyển tất cả mọi thứ nó nhận được tới IIS (trang web nghe trên một cổng hoặc IP khác), nhưng theo dõi tổng kích thước yêu cầu khi nhận được. Khi kích thước từ kết nối cho vượt quá giới hạn bạn muốn, hãy đóng kết nối. Trả lại chuyển hướng đến trang lỗi nếu bạn muốn lịch sự.

Ngớ ngẩn, nhưng nó sẽ cho phép bạn theo dõi dữ liệu quá cảnh mà không cần chờ IIS giao lại yêu cầu.

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