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.
+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. –
có thể bạn có thể tham khảo: http://stackoverflow.com/questions/14032918/setting-maxrequestlength -programmatically/14033087 # 14033087 –