1. 06:44 06/08/2026
Upload file là một tính năng rất phổ biến: ảnh đại diện, hóa đơn, tài liệu, video, file import dữ liệu... Nhưng nếu thiết kế qua loa, nó có thể làm chậm hệ thống, tốn dung lượng, gây lỗi khó truy vết hoặc mở ra rủi ro bảo mật. Dưới đây là một số kinh nghiệm thực tế khi xây dựng tính năng upload file cho web/app.
Trước hết, đừng chỉ kiểm tra file ở phía frontend. Việc giới hạn dung lượng, định dạng hoặc số lượng file trên giao diện chỉ giúp trải nghiệm tốt hơn, không phải lớp bảo vệ chính. Backend vẫn phải kiểm tra lại: kích thước tối đa, phần mở rộng, MIME type, số lượng file trong một request và quyền của người dùng. Người dùng có thể bỏ qua frontend và gửi request trực tiếp bằng công cụ khác.
Một lỗi phổ biến là tin hoàn toàn vào tên file gốc. Tên file do người dùng cung cấp có thể trùng nhau, chứa ký tự lạ hoặc gây rắc rối khi lưu trữ. Cách an toàn hơn là tạo tên file mới bằng UUID hoặc hash, còn tên gốc chỉ lưu như metadata để hiển thị khi cần. Ví dụ: thay vì lưu “hop-dong.pdf”, hệ thống lưu file dưới dạng “f3a1...pdf” và ghi nhận tên gốc trong database.
Với file lớn, không nên bắt request chính xử lý quá nhiều việc. Nếu người dùng upload ảnh, backend có thể lưu file tạm, trả phản hồi nhanh, rồi dùng background job để resize ảnh, quét virus, trích xuất metadata hoặc chuyển đổi định dạng. Cách này giúp API không bị treo lâu và giảm nguy cơ timeout.
Nếu hệ thống có nhiều người dùng hoặc file lớn, nên cân nhắc upload trực tiếp lên object storage thông qua URL có thời hạn. Luồng phổ biến là: frontend xin backend một upload URL, frontend gửi file trực tiếp lên nơi lưu trữ, sau đó báo backend xác nhận file đã upload. Như vậy backend không phải gánh toàn bộ băng thông file.
Cũng cần phân biệt file công khai và file riêng tư. Ảnh sản phẩm có thể public, nhưng hợp đồng, giấy tờ cá nhân hoặc hóa đơn thì không nên chỉ lưu bằng một đường dẫn đoán được. Với file nhạy cảm, nên kiểm tra quyền khi tải xuống, dùng signed URL có thời hạn hoặc route trung gian để xác thực người dùng.
Một checklist ngắn có thể áp dụng:
- Giới hạn dung lượng file ở cả frontend và backend.
- Không dùng tên file gốc làm tên lưu trữ chính.
- Kiểm tra định dạng file ở backend, không chỉ dựa vào phần mở rộng.
- Tách xử lý nặng như resize, scan, convert sang background job.
- Có cơ chế dọn file tạm hoặc file upload dang dở.
- Ghi log đủ thông tin: user nào upload, loại file gì, dung lượng bao nhiêu, trạng thái xử lý ra sao.
- Với file riêng tư, luôn kiểm tra quyền truy cập khi tải xuống.
Một ví dụ thực tế: ứng dụng cho phép người dùng upload ảnh đại diện. Thiết kế tốt hơn là backend nhận file, kiểm tra dung lượng dưới mức cho phép, xác nhận đây là ảnh hợp lệ, lưu bản gốc vào storage, tạo job resize ra các kích thước nhỏ hơn, rồi cập nhật avatar khi xử lý xong. Trong lúc chờ, giao diện có thể hiển thị trạng thái “Đang xử lý ảnh”. Nếu resize thất bại, người dùng được báo rõ ràng thay vì thấy ảnh bị vỡ mà không biết lý do.
Upload file không chỉ là “chọn file rồi lưu”. Nó liên quan đến bảo mật, hiệu năng, chi phí lưu trữ và trải nghiệm người dùng. Làm kỹ từ đầu sẽ giúp hệ thống ổn định hơn, đặc biệt khi lượng người dùng và số lượng file tăng lên.