メインコンテンツまでスキップ

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.alertsys.toast を使用しています