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 và -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
Ghi đầu ra vào file được đặt tên thay vì stdout
Ghi đầu ra vào file được đặt tên giống file từ xa
Tự động theo dõi chuyển hướng HTTP 3xx
Tiếp tục/phục hồi quá trình truyền file trước đó
Giới hạn tốc độ truyền ở mức cho trước
Từ chối tải file lớn hơn kích thước chỉ định
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
Cung cấp username:password để xác thực server
Thử lại truyền khi gặp lỗi tạm thời (số lần)
Đợi số giây này giữa các lần thử lại
Upload file cục bộ lên URL (mặc định là PUT)
Tạo thư mục cục bộ khi cần thiết để lưu đầu ra
Ẩn đồng hồ tiến trình và thông báo lỗi
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
-okhi 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.pdfcurl -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êndata.csvtrong thư mục hiện tại. - Cách sử dụng phổ biến
- Sử dụng
-Okhi 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-othay thế.
$ curl -O https://example.com/files/data.csvcurl -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
-Lvới-ohoặc-Okhi 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.gzcurl -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 HTTPRangeđể 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 headerRange: 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.zipcurl --limit-rate: Giới hạn tốc độ tải
- Chức năng
- Flag
--limit-rategiới hạn tốc độ tải (và upload) ở mức chỉ định. Nó chấp nhận các hậu tố:khoặcKcho kilobyte/s,mhoặcMcho megabyte/s,ghoặcGcho 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.isocurl --max-filesize: Hủy nếu file quá lớn
- Chức năng
- Flag
--max-filesizeyêu cầu curl hủy quá trình truyền nếu kích thước file dự kiến (từ headerContent-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.bincurl -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 headerContent-Dispositioncủ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
-Jvớ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=csvcurl -#: 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.gzCác tùy chọn tải file bổ sung
Cung cấp username:password để xác thực server
Thử lại truyền khi gặp lỗi tạm thời (số lần)
Đợi số giây này giữa các lần thử lại
Upload file cục bộ lên URL (mặc định là PUT)
Tạo thư mục cục bộ khi cần thiết để lưu đầu ra
Ẩn đồng hồ tiến trình và thông báo lỗi
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.txtTả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.sqlTả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 và -o để tải đầy đủ.
$ curl -H "Authorization: Bearer eyJhbGciOi..." -L -o data.json https://api.example.com/exportTả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.zipCâ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 và -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.