Upload Tệp Có Thể Tiếp Tục (Resumable) Với Giao Thức tus Trong JavaScript
Triển khai upload file có thể tự khôi phục khi mất mạng bằng giao thức tus và tus-js-client. Tặng kèm file mẫu 1GB để kiểm tra server.
Gián đoạn mạng trên các mạng di động và Wi-Fi không ổn định thường xuyên làm gián đoạn các request HTTP tải lên thông thường. Giao thức tus là một đặc tả mở, tiêu chuẩn hóa (tus.io) được thiết kế đặc biệt cho việc tải lên tệp tin có thể tiếp tục qua HTTP/1.1 và HTTP/2.
Cách Hoạt Động Của Giao Thức tus
Thay vì một request đơn khổng lồ, tus sử dụng các HTTP verb tiêu chuẩn để phối hợp byte offset:
- POST: Tạo một URL tài nguyên upload trên máy chủ kèm metadata và tổng kích thước.
- PATCH: Gửi phạm vi byte bắt đầu từ một
Upload-Offsetcụ thể. - HEAD: Truy vấn offset hiện tại sau khi kết nối bị ngắt đột ngột.
Mô phỏng sự cố mạng nặng với file PDF mẫu 1GB để kiểm thử tính năng tiếp tục upload của tus-js-client.
Tải File Mẫu 1GB PDF →Sử Dụng tus-js-client Trong JavaScript Hiện Đại
import * as tus from 'tus-js-client';
export function startResumableUpload(file: File, endpoint: string) {
const upload = new tus.Upload(file, {
endpoint: endpoint, // ví dụ: https://upload.example.com/files/
retryDelays: [0, 1000, 3000, 5000],
chunkSize: 5 * 1024 * 1024, // chunk 5MB
metadata: {
filename: file.name,
filetype: file.type,
},
onError: (error) => {
console.error('Tải lên thất bại:', error);
},
onProgress: (bytesUploaded, bytesTotal) => {
const percentage = ((bytesUploaded / bytesTotal) * 100).toFixed(2);
console.log(`Đã tải ${bytesUploaded} / ${bytesTotal} byte (${percentage}%)`);
},
onSuccess: () => {
console.log('Tải lên hoàn tất! URL:', upload.url);
},
});
// Kiểm tra xem có thể tiếp tục phiên upload trước không
upload.findPreviousUploads().then((previousUploads) => {
if (previousUploads.length > 0) {
upload.resumeFromPreviousUpload(previousUploads[0]);
}
upload.start();
});
return upload;
}
Hỗ Trợ Backend Cho tus
- tusd (Go): Triển khai tham chiếu chính thức, được tối ưu hóa cao với các backend S3, Google Cloud Storage, và Azure Blob.
- Uppy Companion: Tích hợp liền mạch với các thành phần frontend Uppy.js.
- Cloudflare Stream: Sử dụng giao thức tus trực tiếp để upload video từ người dùng.
Nguyễn Đại Long
Tác GiảBackend Lead • Chuyên gia Kiến trúc Hệ thống Phân tán & Lưu trữ Đám mây
Hơn 4 năm kinh nghiệm thiết kế các hệ thống xử lý tệp tải lên thông lượng lớn, tối ưu hóa cơ sở dữ liệu và hạ tầng phân tán Cloudflare R2 / AWS S3. Người sáng lập FileDummy và Mạng lưới Hệ sinh thái NDL.
Bài viết này có hữu ích không?
Bấm Thích để ủng hộ tác giả và giúp bài viết lan tỏa tới cộng đồng lập trình viên.
Thảo Luận Kỹ Thuật & Đóng Góp Ý Kiến (0)
Chia sẻ kết quả benchmark, phản hồi các trường hợp biên hoặc đặt câu hỏi chuyên môn.
Chưa có bình luận nào. Hãy là lập trình viên đầu tiên bắt đầu cuộc thảo luận!
Câu Hỏi Thường Gặp (FAQ)
What is the tus protocol?▾
tus is an open protocol for resumable HTTP file uploads. When a connection drops, the client queries the server for the last byte offset and resumes from that point without re-uploading already-sent data.
Does tus work with mobile browsers?▾
Yes. tus-js-client supports browsers, Node.js, and React Native. The library stores the upload URL in localStorage so uploads resume after a page reload or app restart.
What backend servers support tus?▾
tusd (official Go reference server), Uppy/Companion, tus-node-server, and native support in Cloudflare Stream for video uploads. Major platforms including Vimeo and Transloadit use tus in production.