Tối ưu hóa khả năng tải lên tệp tin lớn trong ASP.NET với RadUpload

Trong quá trình phát triển ứng dụng web sử dụng ASP.NET, việc xử lý tải lên tệp tin (file upload) thường gặp nhiều thách thức khi đối mặt với các dữ liệu dung lượng lớn. Điều khiển FileUpload mặc định có những hạn chế nhất định về thời gian timeout và khó khăn trong việc hiển thị tiến trình tải lên (progress bar) cho người dùng. Để giải quyết vấn đề này một cách hiệu quả, chúng ta có thể tích hợp một thư viện bên thứ ba hỗ trợ xử lý multipart request và hiển thị tiến độ tải file.

1. Chuẩn bị dự án

Đầu tiên, bạn cần tích hợp các thư viện cần thiết vào dự án. Hãy đảm bảo sao chép các file thư viện liên quan (file .dll) và file tài liệu đi kèm (file .xml) vào thư mục bin của ứng dụng web. Việc này giúp ứng dụng nhận diện các điều khiển (controls) và các lớp xử lý tải lên mới.

2. Cấu hình giao diện (ASPX)

Trên trang .aspx, ngoài việc sử dụng điều khiển FileUpload chuẩn, chúng ta cần khai báo các điều khiển quản lý tiến trình từ thư viện mới. Đầu tiên, thêm directive Register tại đầu trang:

<%@ Register TagPrefix="telerik" Namespace="Telerik.QuickStart" Assembly="Telerik.QuickStart" %>
<%@ Register TagPrefix="radU" Namespace="Telerik.WebControls" Assembly="RadUpload.Net2" %>

Tiếp theo, thiết lập giao diện trong phần body của trang web. Chúng ta sẽ thêm một RadProgressManager để quản lý tiến trình và một RadProgressArea để hiển thị thanh tiến độ:

<radU:RadProgressManager ID="progressManager" Width="100%" runat="server" />
<radU:RadProgressArea ID="progressDisplay" Width="100%" runat="server"></radU:RadProgressArea>
<asp:FileUpload ID="fileSelector" runat="server" />

3. Cấu hình Web.config

Để cho phép tải lên các tệp tin lớn, bạn cần điều chỉnh cấu hình trong file web.config. Trong thẻ <system.web>, hãy tăng giá trị maxRequestLengthexecutionTimeout. Ngoài ra, cần đăng ký HttpModule và HttpHandler chuyên dụng để thư viện có thể chặn và xử lý request tải lên:

<system.web>
    <httpRuntime executionTimeout="3600" maxRequestLength="2097151" />
    <httpModules>
        <add name="RadUploadModule" type="Telerik.WebControls.RadUploadHttpModule, RadUpload.Net2"/>
    </httpModules>
    <httpHandlers>
        <add verb="*" path="Telerik.RadUploadProgressHandler.aspx" type="Telerik.WebControls.RadUploadProgressHandler, RadUpload.Net2"/>
    </httpHandlers>
</system.web>

4. Xử lý logic phía máy chủ (C#)

Tại code-behind (file .cs), chúng ta sẽ sử dụng đối tượng RadUploadContext để truy xuất dữ liệu tệp tin đã tải lên thay vì sử dụng PostedFile của điều khiển mặc định. Dưới đây là ví dụ về cách xử lý lưu tệp tin:

using System;
using System.IO;
using Telerik.WebControls;

public void ProcessUpload()
{
    // Lấy ngữ cảnh tải lên hiện tại
    var uploadContext = RadUploadContext.Current;
    
    // Kiểm tra xem có dữ liệu nào không
    if (uploadContext == null) return;

    // Lấy danh sách các tệp tin đã tải lên
    var uploadedFiles = uploadContext.UploadedFiles;

    if (uploadedFiles.Count == 0) 
    {
        Page.ClientScript.RegisterStartupScript(Page.GetType(), "Notification", "<script>alert('Vui lòng chọn tệp tin để tải lên.');</script>");
        return;
    }

    // Xử lý tệp tin đầu tiên (có thể dùng vòng lặp foreach nếu nhiều tệp)
    UploadedFile targetFile = uploadedFiles[0];

    // Giới hạn kích thước tối đa (ví dụ 2GB)
    const long MaxSizeBytes = 2147483647;
    if (targetFile.ContentLength >= MaxSizeBytes)
    {
        Page.ClientScript.RegisterStartupScript(Page.GetType(), "SizeError", "<script>alert('Tệp tin vượt quá dung lượng cho phép (2GB).');</script>");
        return;
    }

    try
    {
        // Xác định đường dẫn lưu trữ
        string sourceName = Path.GetFileName(targetFile.FileName);
        string serverSavePath = Server.MapPath("~/Uploads/" + sourceName);

        // Thực hiện lưu tệp tin vào ổ cứng server
        // Tham số thứ 2 là 'true' để ghi đè nếu tệp đã tồn tại
        targetFile.SaveAs(serverSavePath, true);
    }
    catch (Exception ex)
    {
        // Xử lý lỗi ghi file
        Page.ClientScript.RegisterStartupScript(Page.GetType(), "SysError", "<script>alert('Lỗi hệ thống: " + ex.Message + "');</script>");
    }
}

Đoạn mã trên thực hiện các bước kiểm tra tính hợp lệ của dữ liệu đầu vào, giới hạn dung lượng tệp tin để tránh quá tải hệ thống, và cuối cùng là lưu tệp tin vào thư mục đích trên máy chủ. Việc sử dụng thư viện này giúp developer dễ dàng kiểm soát các request lớn mà không lo bị ngắt kết nối hay thiếu thông tin phản hồi cho người dùng.

Thẻ: asp.net Telerik RadUpload fileUpload csharp

Đăng vào ngày 30 tháng 8 lúc 05:24