FTP 파일 다운로드 (ftp.download)
선언
다운로드 성공 여부, 다운로드 정보 = ftp.download(URL, 로컬 파일 경로 [, 연결 제한 시간(초), 이어받기 모드, 블록 콜백 함수, 버퍼 크기 ])
매개변수
- URL
문자열형. 원격 파일 주소이며 계정과 비밀번호도 이 매개변수에 포함됩니다. - 로컬 파일 경로
문자열형. 파일을 저장할 로컬 경로입니다. - 연결 제한 시간(초)
실수형 선택 매개변수. 연결 제한 시간이며 단위는 초, 기본값은 10입니다. - 이어받기 모드
불리언형 선택 매개변수. 이어받기를 지원할지 여부이며 지원하면 true, 아니면 false입니다. 기본값은 false입니다. - 블록 콜백 함수
함수형 선택 매개변수. 블록 하나를 다운로드할 때마다 한 번 호출되며 기본값은 빈 함수입니다.
첫 번째 매개변수는 현재 다운로드 정보이며 콜백 함수가 true를 반환하면 이번 다운로드를 중단합니다. - 버퍼 크기
정수형 선택 매개변수. 버퍼 크기의 바이트 수이며 기본적으로 최적 구성을 자동 선택합니다.
반환값
- 다운로드 성공 여부
불리언형. 연결 성공 여부입니다. - 다운로드 정보
테이블형 또는 문자열형. 연결에 성공하면 테이블형 다운로드 정보를 반환하고, 실패하면 연결 실패 원인을 설명하는 문자열을 반환합니다.
설명
-- 두 번째 반환값인 다운로드 정보의 구조는 다음과 같습니다.
{
resource_size = 원격 리소스의 전체 바이트 수,
start_pos = 이번 다운로드의 리소스 시작 위치,
size_download = 이번 다운로드의 바이트 수,
speed_download = 이번 다운로드 속도 (단위: 바이트/초),
}
이 함수는 대용량 파일 다운로드에 적합하며 전송 중에 스크립트를 중지하면 반응이 느릴 수 있습니다.
이 함수는 실행권을 양보할 수 있으며 반환되기 전에 다른 스레드가 실행 기회를 얻을 수 있습니다.
간단한 예제
계정과 비밀번호는 URL에 작성하며 구체적인 URL 형식은 다음과 같습니다. (대괄호 안은 선택 매개변수입니다.)
ftp://[계정:암호@]주소[:포트]/경로
계정 또는 비밀번호에
@,:,/문자가 포함되면 각각%40,%3A,%2F로 이스케이프할 수 있습니다(URL에서 허용되지 않는 다른 문자는 URL 퍼센트 인코딩을 사용할 수 있습니다). 예를 들어 계정이havonz, 비밀번호가11@@22라면 다음과 같습니다.
local done, info = ftp.download("ftp://havonz:11%40%[email protected]/1.zip", "/var/mobile/1.zip")
if (done) then
sys.alert("下载完成")
else
sys.alert("连接失败:"..info)
end
복잡한 예제
local done, info = ftp.download("ftp://havonz:[email protected]/1.zip", "/var/mobile/1.zip", 10, true, function(binfo)
local percent = math.floor(((binfo.start_pos + binfo.size_download) / binfo.resource_size) * 100)
sys.toast("下载进度 "..percent.."%")
end, 4096 * 1024)
--
if (done) then
if (info.start_pos + info.size_download < info.resource_size) then
sys.alert(
"下载中断\n本次下载 "..info.size_download.." 字节"
.."\n从第 "..info.start_pos.." 字节开始下载"
.."\n平均速度为 "..math.floor(info.speed_download/1024).." kB/s"
.."\n还有剩 "..(info.resource_size - (info.start_pos + info.size_download)).." 字节"
)
else
sys.alert(
"下载完成\n本次下载 "..info.size_download.." 字节"
.."\n从第 "..info.start_pos.." 字节开始下载"
.."\n平均速度为 "..math.floor(info.speed_download/1024).." kB/s"
)
end
else
sys.alert("连接失败:"..info)
end