Pular para o conteúdo principal

Download de arquivo HTTP (http.download)

Declaração

sucesso, informações_do_download = http.download(URL, caminho_do_arquivo_local [, segundos_de_timeout_da_conexão, modo_de_retomada, função_de_callback_por_bloco, tamanho_do_buffer ])

Parâmetros

  • URL
    Texto; endereço do arquivo remoto.
  • caminho do arquivo local
    Texto; caminho local onde o arquivo será salvo.
  • segundos de timeout da conexão
    Número real opcional; tempo limite da conexão, em segundos. O padrão é 10.
  • modo de retomada
    Booleano opcional; indica se a retomada do download deve ser aceita. Use true para aceitar e false para não aceitar; o padrão é false.
  • função de callback por bloco
    Função opcional; é chamada após cada bloco baixado. O padrão é uma função vazia.
    O primeiro argumento do callback contém as informações do download atual; se o callback retornar true, o download será interrompido.
  • tamanho do buffer
    Inteiro opcional; tamanho do buffer em bytes. O padrão é a configuração automática ideal.

Valores retornados

  • sucesso do download
    Booleano; indica se a conexão foi bem-sucedida.
  • informações do download
    Tabela ou texto; retorna uma tabela de informações do download quando a conexão é bem-sucedida, ou uma descrição textual do motivo da falha da conexão.

Descrição

-- a estrutura das informações do download, o segundo valor retornado, é a seguinte
{
resource_size = total_de_bytes_do_recurso_remoto,
start_pos = posição_inicial_deste_download_no_recurso,
size_download = quantidade_de_bytes_deste_download,
speed_download = velocidade_deste_download (em bytes/segundo),
}

Esta função é adequada para downloads de arquivos grandes; interromper o script durante a transferência pode demorar.
Esta função pode ceder a execução; antes de retornar, outras threads podem ter a oportunidade de executar.

Exemplo simples

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

Exemplo complexo

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

Observação: o código acima usa as funções sys.alert e sys.toast, que não pertencem a este capítulo.

Referência de mensagens de erro

Requested range was not delivered by the server indica que o servidor pode não aceitar retomada de download; basta definir a opção de retomada como false.