본문으로 건너뛰기

FTP 파일 업로드 (ftp.upload)

선언

업로드 성공 여부, 업로드 정보 = ftp.upload(로컬 파일 경로, URL [, 연결 제한 시간(), 이어올리기 모드, 블록 콜백 함수, 버퍼 크기 ])

매개변수

  • 로컬 파일 경로
    문자열형. 로컬 파일 경로입니다.
  • URL
    문자열형. 업로드할 원격 주소이며 계정과 비밀번호도 이 매개변수에 포함됩니다.
  • 연결 제한 시간(초)
    실수형 선택 매개변수. 연결 제한 시간이며 단위는 초, 기본값은 10입니다.
  • 이어올리기 모드
    불리언형 선택 매개변수. 이어올리기를 지원할지 여부이며 지원하면 true, 아니면 false입니다. 기본값은 false입니다.
  • 블록 콜백 함수
    함수형 선택 매개변수. 블록 하나를 업로드할 때마다 한 번 호출되며 기본값은 빈 함수입니다.
    첫 번째 매개변수는 현재 업로드 정보이며 콜백 함수가 true를 반환하면 이번 업로드를 중단합니다.
  • 버퍼 크기
    정수형 선택 매개변수. 버퍼 크기의 바이트 수이며 기본적으로 최적 구성을 자동 선택합니다.

반환값

  • 업로드 성공 여부
    불리언형. 연결 성공 여부입니다.
  • 업로드 정보
    테이블형 또는 문자열형. 연결에 성공하면 테이블형 업로드 정보를 반환하고, 실패하면 연결 실패 원인을 설명하는 문자열을 반환합니다.

설명

-- 두 번째 반환값인 업로드 정보의 구조는 다음과 같습니다.
{
resource_size = 로컬 파일의 전체 바이트 수,
start_pos = 이번 업로드의 로컬 파일 시작 위치,
size_upload = 이번 업로드의 바이트 수,
speed_upload = 이번 업로드 속도 (단위: 바이트/),
}

이 함수는 대용량 파일 업로드에 적합하며 전송 중에 스크립트를 중지하면 반응이 느릴 수 있습니다.
이 함수는 실행권을 양보할 수 있으며 반환되기 전에 다른 스레드가 실행 기회를 얻을 수 있습니다.

간단한 예제

계정과 비밀번호는 URL에 작성하며 구체적인 URL 형식은 다음과 같습니다. (대괄호 안은 선택 매개변수입니다.)

ftp://[계정:암호@]주소[:포트]/경로

계정 또는 비밀번호에 @, :, / 문자가 포함되면 각각 %40, %3A, %2F로 이스케이프할 수 있습니다(URL에서 허용되지 않는 다른 문자는 URL 퍼센트 인코딩을 사용할 수 있습니다). 예를 들어 계정이 havonz, 비밀번호가 11@@22라면 다음과 같습니다.

local done, info = ftp.upload("/var/mobile/1.zip", "ftp://havonz:11%40%[email protected]/1.zip")
if (done) then
sys.alert("上传完成")
else
sys.alert("连接失败:"..info)
end

복잡한 예제

local done, info = ftp.upload("/var/mobile/1.zip", "ftp://havonz:[email protected]/1.zip", 10, true, function(binfo)
local percent = math.floor(((binfo.start_pos + binfo.size_upload) / binfo.resource_size) * 100)
sys.toast("上传进度 "..percent.."%")
end, 4096 * 1024)
--
if (done) then
if (info.start_pos + info.size_upload < info.resource_size) then
sys.alert(
"上传中断\n本次上传 "..info.size_upload.." 字节"
.."\n从第 "..info.start_pos.." 字节开始上传"
.."\n平均速度为 "..math.floor(info.speed_upload/1024).." kB/s"
.."\n还有剩 "..(info.resource_size - (info.start_pos + info.size_upload)).." 字节"
)
else
sys.alert(
"上传完成\n本次上传 "..info.size_upload.." 字节"
.."\n从第 "..info.start_pos.." 字节开始上传"
.."\n平均速度为 "..math.floor(info.speed_upload/1024).." kB/s"
)
end
else
sys.alert("连接失败:"..info)
end

참고: 위 코드에서는 이 장에서 다루지 않는 함수 sys.alert, sys.toast를 사용했습니다.