Cách tải file bằng curl

curl là một trong những công cụ dòng lệnh đa năng nhất để tải file qua HTTP, HTTPS, FTP và hàng chục giao thức khác. Dù bạn cần lưu một phản hồi API vào file hay tự động hóa việc tải hàng loạt trong shell script, curl đều có flag phù hợp. Hướng dẫn này bao gồm mọi tùy chọn liên quan đến tải file — từ việc lưu file cơ bản với -o-O đến việc tiếp tục các bản truyền bị gián đoạn với -C -, giới hạn băng thông với --limit-rate và hiển thị thanh tiến trình. Mỗi flag bao gồm giải thích rõ ràng, các mẫu sử dụng phổ biến và ví dụ sẵn sàng để sao chép.

Bảng tham chiếu nhanh các flag tải file

-o

Ghi đầu ra vào file được đặt tên thay vì stdout

-O

Ghi đầu ra vào file được đặt tên giống file từ xa

-L

Tự động theo dõi chuyển hướng HTTP 3xx

-C -

Tiếp tục/phục hồi quá trình truyền file trước đó

--limit-rate

Giới hạn tốc độ truyền ở mức cho trước

--max-filesize

Từ chối tải file lớn hơn kích thước chỉ định

-J

Sử dụng header Content-Disposition để đặt tên file

-#

Hiển thị tiến trình truyền dưới dạng thanh tiến trình đơn giản

-u

Cung cấp username:password để xác thực server

--retry

Thử lại truyền khi gặp lỗi tạm thời (số lần)

--retry-delay

Đợi số giây này giữa các lần thử lại

-T

Upload file cục bộ lên URL (mặc định là PUT)

--create-dirs

Tạo thư mục cục bộ khi cần thiết để lưu đầu ra

-s

Ẩn đồng hồ tiến trình và thông báo lỗi

--output-dir

Lưu file đầu ra vào thư mục chỉ định (curl 7.73+)

curl -o: Lưu với tên file cụ thể

Chức năng
Flag -o (hoặc --output) yêu cầu curl lưu nội dung phản hồi vào file bạn chỉ định. Nếu không có nó, curl in phản hồi ra stdout (terminal của bạn). Bạn có thể sử dụng bất kỳ tên file và đường dẫn nào — curl sẽ tạo file hoặc ghi đè file hiện có.
Cách sử dụng phổ biến
Sử dụng -o khi bạn cần kiểm soát chính xác tên file hoặc lưu vào thư mục cụ thể. Nó hoạt động với bất kỳ giao thức nào — HTTP, HTTPS, FTP, SFTP và hơn nữa. Kết hợp với -L để xử lý chuyển hướng và -s để hoạt động im lặng trong script.
$ curl -o report.pdf https://example.com/files/report.pdf

curl -O: Lưu với tên file từ xa

Chức năng
Flag -O (hoặc --remote-name) lưu file tải về sử dụng tên file được trích xuất từ URL. Ví dụ, nếu URL kết thúc bằng /data.csv, curl tạo file có tên data.csv trong thư mục hiện tại.
Cách sử dụng phổ biến
Sử dụng -O khi tên file từ xa có ý nghĩa và bạn không cần đổi tên. Bạn có thể truyền nhiều flag -O để tải nhiều file trong một lệnh. Lưu ý: nếu URL không chứa tên file (ví dụ, kết thúc bằng /), curl sẽ thất bại — sử dụng -o thay thế.
$ curl -O https://example.com/files/data.csv

curl -L: Theo dõi chuyển hướng

Chức năng
Flag -L (hoặc --location) yêu cầu curl tự động theo dõi các chuyển hướng HTTP — 301 (Moved Permanently), 302 (Found), 307 và 308. Nếu không có -L, curl trả về phản hồi chuyển hướng thay vì nội dung thực tế.
Cách sử dụng phổ biến
Hầu hết các URL tải file chuyển hướng ít nhất một lần (ví dụ, từ HTTP sang HTTPS, hoặc từ URL ngắn sang file thực tế). Luôn kết hợp -L với -o hoặc -O khi tải file. Mặc định curl theo dõi tối đa 50 chuyển hướng; thay đổi bằng --max-redirs.
$ curl -L -o latest.tar.gz https://github.com/user/repo/releases/latest/download/app.tar.gz

curl -C -: Tiếp tục tải bị gián đoạn

Chức năng
Flag -C - (hoặc --continue-at -) yêu cầu curl tự động phát hiện kích thước file không đầy đủ hiện có và tiếp tục tải từ chỗ dừng lại. Server phải hỗ trợ header HTTP Range để tính năng này hoạt động.
Cách sử dụng phổ biến
Nếu quá trình tải file lớn bị gián đoạn do sự cố mạng hoặc hết thời gian, chỉ cần chạy lại lệnh tương tự với -C - được thêm vào. curl sẽ gửi header Range: bytes=OFFSET- và chỉ tải dữ liệu còn lại. Đây là tính năng thiết yếu cho file lớn qua kết nối không ổn định.
$ curl -C - -o largefile.zip https://cdn.example.com/largefile.zip

curl --limit-rate: Giới hạn tốc độ tải

Chức năng
Flag --limit-rate giới hạn tốc độ tải (và upload) ở mức chỉ định. Nó chấp nhận các hậu tố: k hoặc K cho kilobyte/s, m hoặc M cho megabyte/s, g hoặc G cho gigabyte/s.
Cách sử dụng phổ biến
Sử dụng --limit-rate để tránh làm bão hòa băng thông khi tải file lớn, đặc biệt trên các kết nối chia sẻ. Nó cũng hữu ích để kiểm tra cách ứng dụng của bạn xử lý phản hồi chậm.
$ curl --limit-rate 1M -o bigfile.iso https://mirror.example.com/bigfile.iso

curl --max-filesize: Hủy nếu file quá lớn

Chức năng
Flag --max-filesize yêu cầu curl hủy quá trình truyền nếu kích thước file dự kiến (từ header Content-Length) vượt quá giới hạn chỉ định. Kích thước có thể sử dụng hậu tố như k, M, G.
Cách sử dụng phổ biến
Sử dụng trong script để ngăn các bản tải lớn bất ngờ chiếm dụng dung lượng đĩa. Lưu ý rằng không phải tất cả server đều gửi Content-Length — trong trường hợp đó, curl không thể áp dụng giới hạn này và việc tải tiếp tục bình thường.
$ curl --max-filesize 100M -o update.bin https://example.com/update.bin

curl -J: Sử dụng tên file do server gợi ý

Chức năng
Flag -J (hoặc --remote-header-name) yêu cầu curl sử dụng tên file được chỉ định trong header Content-Disposition của server thay vì lấy từ URL. Đây là trường hợp phổ biến với các API tải file trả về file có tên có ý nghĩa.
Cách sử dụng phổ biến
Luôn kết hợp -J với -O. Đây là tính năng hữu ích khi URL là endpoint API (như /export?format=csv) nhưng server trả về tên file phù hợp trong header. Lưu ý bảo mật: server kiểm soát tên file, nên chỉ sử dụng với server đáng tin cậy.
$ curl -L -O -J https://example.com/api/export?format=csv

curl -#: Hiển thị thanh tiến trình

Chức năng
Flag -# (hoặc --progress-bar) thay thế đồng hồ tiến trình chi tiết mặc định bằng thanh tiến trình ### đơn giản. Đây dễ đọc hơn cho sử dụng tương tác.
Cách sử dụng phổ biến
Sử dụng -# khi tải tương tác và bạn muốn chỉ báo tiến trình sạch sẽ. Cho script, ưu tiên -s (im lặng) hoặc đồng hồ tiến trình mặc định. Đầu ra curl mặc định đã hiển thị tốc độ, phần trăm, thời gian còn lại và tổng kích thước.
$ curl -# -o archive.tar.gz https://example.com/archive.tar.gz

Các tùy chọn tải file bổ sung

-u

Cung cấp username:password để xác thực server

--retry

Thử lại truyền khi gặp lỗi tạm thời (số lần)

--retry-delay

Đợi số giây này giữa các lần thử lại

-T

Upload file cục bộ lên URL (mặc định là PUT)

--create-dirs

Tạo thư mục cục bộ khi cần thiết để lưu đầu ra

-s

Ẩn đồng hồ tiến trình và thông báo lỗi

--output-dir

Lưu file đầu ra vào thư mục chỉ định (curl 7.73+)

Các tình huống tải file thực tế

Các ví dụ này kết hợp nhiều flag để xử lý các tác vụ tải file phổ biến mà bạn sẽ gặp trong quá trình phát triển và viết script hàng ngày.

Tải nhiều file cùng lúc

Sử dụng nhiều flag -O để tải nhiều file trong một lệnh. curl xử lý chúng tuần tự. Để tải song song, sử dụng xargs hoặc GNU parallel.

$ curl -O https://example.com/file1.txt -O https://example.com/file2.txt -O https://example.com/file3.txt

Tải từ server FTP

curl hỗ trợ FTP, FTPS và SFTP. Thêm -u user:password để truy cập có xác thực. Sử dụng -O để giữ tên file từ xa.

$ curl -u user:pass -o backup.sql ftp://ftp.example.com/db/backup.sql

Tải với xác thực

Sử dụng -u user:pass cho Basic Auth, hoặc -H để truyền Bearer token hoặc API key. Kết hợp với -L-o để tải đầy đủ.

$ curl -H "Authorization: Bearer eyJhbGciOi..." -L -o data.json https://api.example.com/export

Tải đáng tin cậy với tiếp tục và thử lại

Kết hợp -C - (tiếp tục), --retry (tự động thử lại khi thất bại) và -L (theo dõi chuyển hướng) để tải bền vững vượt qua gián đoạn mạng.

$ curl -C - --retry 5 --retry-delay 10 -L -o largefile.zip https://cdn.example.com/largefile.zip

Câu hỏi thường gặp về tải file bằng curl

Sự khác biệt giữa curl -o và curl -O là gì?

-o filename lưu bản tải vào tên file chính xác bạn chỉ định. -O trích xuất tên file từ URL và sử dụng nó. Sử dụng -o khi bạn muốn tên hoặc đường dẫn tùy chỉnh; sử dụng -O khi tên file từ xa phù hợp.

Tại sao curl tải file rỗng hoặc file HTML thay vì file thực tế?

URL có thể trả về chuyển hướng HTTP (301 hoặc 302). Mặc định, curl lưu phản hồi chuyển hướng — không phải nội dung cuối cùng. Thêm -L để tự động theo dõi chuyển hướng: curl -L -o file URL.

Làm thế nào để tiếp tục tải file bị gián đoạn với curl?

Sử dụng curl -C - -o filename URL. Flag -C - phát hiện kích thước file hiện có và gửi header Range để chỉ yêu cầu các byte còn lại. Server phải hỗ trợ range request để tính năng này hoạt động.

Làm thế nào để giới hạn tốc độ tải trong curl?

Sử dụng --limit-rate với giá trị và hậu tố: curl --limit-rate 500k -o file URL giới hạn tốc độ ở 500 KB/s. Các hậu tố: k (KB/s), M (MB/s), G (GB/s).

curl có thể tải nhiều file cùng lúc không?

Có. Sử dụng nhiều flag -O: curl -O URL1 -O URL2 -O URL3. curl tải chúng tuần tự. Để tải song song, pipe danh sách URL tới xargs -P 4 -I {} curl -O {}.

Làm thế nào để tải file yêu cầu xác thực?

Cho HTTP Basic Auth: curl -u user:pass -o file URL. Cho Bearer token: curl -H "Authorization: Bearer TOKEN" -o file URL. Cho API key trong header: curl -H "X-API-Key: KEY" -o file URL.

Làm thế nào để tải file từ server FTP bằng curl?

Sử dụng curl -u user:pass -o localfile ftp://host/path/file. curl hỗ trợ FTP, FTPS (FTP qua TLS) và SFTP (SSH FTP). Cho FTP ẩn danh, bỏ qua -u.

Làm thế nào để tải file lớn đáng tin cậy với curl?

Kết hợp -C - (tiếp tục khi thất bại), --retry 5 (tự động thử lại), --retry-delay 10-L (theo dõi chuyển hướng): curl -C - --retry 5 --retry-delay 10 -L -o file URL. Điều này tự động xử lý các sự cố mạng.

Làm thế nào để hiển thị thanh tiến trình khi tải bằng curl?

Sử dụng curl -# -o file URL cho thanh tiến trình đơn giản. Đầu ra curl mặc định đã hiển thị tốc độ truyền, phần trăm và thời gian ước tính. Cho script, sử dụng -s để ẩn tất cả đầu ra.

Tôi có thể chỉ định thư mục tải trong curl không?

Với curl 7.73+, sử dụng --output-dir /path/to/dir kết hợp với -O. Cho phiên bản cũ hơn, chỉ định đường dẫn đầy đủ với -o /path/to/dir/filename. Thêm --create-dirs nếu thư mục chưa tồn tại.

Nên sử dụng curl hay wget để tải file?

Cả hai đều tuyệt vời. wget đơn giản hơn cho việc sao chép website đệ quy và có sẵn logic thử lại. curl hỗ trợ hơn 25 giao thức (không chỉ HTTP/FTP), tốt hơn cho các cuộc gọi API và viết script, hỗ trợ nhiều phương thức xác thực hơn và có sẵn trên hầu hết mọi hệ điều hành.

Làm thế nào để sử dụng curl trong bash script để tải file?

Sử dụng curl -fsSL -o file URL: -f thất bại im lặng khi gặp lỗi HTTP (không lưu trang lỗi), -s im lặng, -S hiển thị lỗi ngay cả trong chế độ im lặng, -L theo dõi chuyển hướng. Kiểm tra mã thoát: if ! curl -fsSL -o file URL; then echo "Download failed"; exit 1; fi.