Перейти к основному содержимому

Загрузка файла по HTTP (http.download)

Объявление

успех_загрузки, информация_о_загрузке = http.download(URL, локальный_путь_к_файлу [, тайм-аут_соединения_в_секундах, режим_возобновления, функция_обратного_вызова_блока, размер_буфера ])

Параметры

  • URL
    Строка, адрес удалённого файла
  • локальный_путь_к_файлу
    Строка, локальный путь для сохранения
  • тайм-аут_соединения_в_секундах
    Вещественное число, необязательный параметр; время ожидания соединения в секундах, по умолчанию 10
  • режим_возобновления
    Логическое значение, необязательный параметр; поддерживать ли возобновление загрузки: true — да, false — нет, по умолчанию false
  • функция_обратного_вызова_блока
    Функция, необязательный параметр; вызывается после загрузки каждого блока, по умолчанию пустая функция
    Первый параметр функции — текущая информация о загрузке; если функция возвращает true, текущая загрузка прерывается
  • размер_буфера
    Целое число, необязательный параметр; размер буфера в байтах, по умолчанию выбирается автоматически

Возвращаемое значение

  • успех_загрузки
    Логическое значение, указывает, удалось ли установить соединение
  • информация_о_загрузке
    Таблица или строка: при успешном соединении возвращается таблица с информацией о загрузке, иначе — текстовое описание причины сбоя соединения

Описание

-- Структура информации о загрузке во втором возвращаемом значении:
{
resource_size = общее число байт удалённого ресурса,
start_pos = начальная позиция текущей загрузки в ресурсе,
size_download = число байт текущей загрузки,
speed_download = скорость текущей загрузки (байт/с),
}

Функция подходит для загрузки больших файлов; остановка скрипта во время передачи может выполняться с задержкой.
Функция может уступить выполнение: до её возврата другие потоки могут получить возможность работать

Простой пример

local done, info = http.download("https://192.168.31.13/1.zip", "/var/mobile/1.zip")
if (done) then
sys.alert("下载完成")
else
sys.alert("连接失败:"..info)
end

Расширенный пример

local done, info = http.download("https://192.168.31.13/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

Примечание: приведённый код использует функции из других разделов: sys.alert и sys.toast.

Справочник сообщений об ошибках

Requested range was not delivered by the server означает, что сервер может не поддерживать возобновление загрузки; установите параметр возобновления в false.