Thực thi lệnh FTP (ftp.cmd)
Khai báo
result, err = ftp.cmd(URL, cmd [, connectTimeoutSec ])
Tham số
- URL
Kiểu chuỗi. URL FTP từ xa, bao gồm tên người dùng và mật khẩu. Khi thao tác với thư mục, hãy dùng URL thư mục kết thúc bằng/. - cmd
Kiểu chuỗi. Một lệnh giao thức FTP, chẳng hạnMKD test. Không hỗ trợ truyền vào bảng chứa các lệnh. - connectTimeoutSec
Kiểu số thực, không bắt buộc. Thời gian chờ kết nối, tính bằng giây, mặc định là 10. Không giới hạn tổng thời gian của toàn bộ yêu cầu.
Giá trị trả về
- result
Kiểu chuỗi hoặc nil. Khi yêu cầu thành công, trả về dữ liệu nhận được, có thể là chuỗi rỗng. Với URL thư mục, dữ liệu thường là danh sách thư mục, không phải mã trạng thái của lệnh FTP hay phản hồi trên kết nối điều khiển. Trả về nil khi thất bại. - err
Kiểu chuỗi hoặc nil. Khi thất bại, trả về chuỗi mô tả nguyên nhân lỗi. Khi thành công, không trả về giá trị thứ hai nên biến nhận giá trị này là nil.
Mô tả
Gửi lệnh đến máy chủ FTP để thực hiện các thao tác như tạo thư mục. Các thao tác tác động đến tệp hoặc thư mục trên máy chủ.
Lệnh được thực thi trước khi chuyển đến thư mục chỉ định trong URL. Đường dẫn tương đối được tính từ thư mục mặc định sau khi đăng nhập; ví dụ, MKD uploads/test tạo test trong uploads bên dưới thư mục đó. Không dựa vào đường dẫn trong URL để thay đổi thư mục làm việc của lệnh. Đường dẫn trong lệnh được gửi trực tiếp, không giải mã phần trăm URL.
MKD thường chỉ tạo một cấp thư mục, nên thư mục cha phải tồn tại sẵn. Thao tác có thể thất bại nếu thư mục đã tồn tại, tài khoản không có quyền hoặc máy chủ không hỗ trợ lệnh tương ứng. Để tạo nhiều cấp thư mục, cần gọi riêng từng lần theo thứ tự từ thư mục cha đến thư mục con.
Trong cách triển khai hiện tại, nếu văn bản lệnh chứa chuỗi viết hoa LIST hoặc NLST, lệnh đó sẽ không được gửi; chỉ yêu cầu mặc định cho URL được thực hiện. Điều này cũng áp dụng khi các chuỗi đó nằm trong tên thư mục. Vì vậy, NLST không chuyển sang danh sách chỉ có tên tệp, và các đối số trong LIST -a cũng không có hiệu lực.
Sau khi thực thi lệnh, hàm vẫn yêu cầu dữ liệu tại URL; với URL thư mục, hàm còn lấy danh sách thư mục. Nếu việc lấy danh sách hoặc kết nối dữ liệu sau đó thất bại, thư mục có thể đã được tạo nhưng hàm vẫn trả về nil cùng thông báo lỗi.
Hàm này có thể nhường quyền thực thi; các luồng khác có thể chạy trước khi hàm trả về.
Ví dụ đơn giản
Đặt tên người dùng và mật khẩu trong URL. Định dạng URL như sau (các phần trong ngoặc vuông là tùy chọn):
ftp://[user:password@]host[:port]/path
Nếu tên người dùng hoặc mật khẩu chứa
@,:hoặc/, có thể lần lượt thay bằng%40,%3A,%2F. Các ký tự khác không hợp lệ trong URL có thể dùng mã hóa phần trăm URL. Ví dụ, với tên người dùnghavonzvà mật khẩu11@@22, tạo test trong thư mục mặc định sau khi đăng nhập:
local result, err = ftp.cmd("ftp://havonz:11%40%[email protected]/", "MKD test", 10)
if result == nil then
sys.alert("Tạo thất bại: " .. tostring(err))
else
sys.alert("Tạo thành công")
end
Ví dụ phức tạp
Lần lượt tạo demo và demo/logs; cả hai thư mục phải chưa tồn tại. Dừng nếu bất kỳ bước nào thất bại. Các thư mục đã tạo trước đó không tự động bị xóa.
local url = "ftp://havonz:11%40%[email protected]/"
for _, path in ipairs({ "demo", "demo/logs" }) do
local result, err = ftp.cmd(url, "MKD " .. path, 10)
if result == nil then
sys.alert("Tạo thất bại " .. path .. ": " .. tostring(err))
return
end
end
sys.alert("Đã tạo xong các thư mục")
Lưu ý: Đoạn mã trên sử dụng hàm sys.alert thuộc chương khác.