Skip to content

Загрузка файлов

Функции загрузки уровня пакета

Download

go
func Download(ctx context.Context, url string, cfg *DownloadConfig, options ...RequestOption) (*DownloadResult, error)

Загружает файл с использованием клиента по умолчанию. Downloadединый канонический вход для загрузки на уровне пакета, интерфейса Client и DomainClient, заменяющий прежнюю матрицу вариантов одной сигнатурой. cfg не может быть nil, и cfg.FilePath должен быть задан (иначе возвращается ErrEmptyFilePath).

go
cfg := httpc.DefaultDownloadConfig()
cfg.FilePath = "/tmp/file.zip"
cfg.Overwrite = true
cfg.ResumeDownload = true

result, err := httpc.Download(context.Background(), url, cfg)

DownloadConfig

go
type DownloadConfig struct {
    FilePath          string
    ProgressCallback  DownloadProgressCallback
    Overwrite         bool
    ResumeDownload    bool
    Checksum          string
    ChecksumAlgorithm ChecksumAlgorithm
}

func DefaultDownloadConfig() *DownloadConfig
ПолеТипПо умолчаниюОписание
FilePathstring-Путь сохранения (обязательно)
ProgressCallbackDownloadProgressCallbacknilОбратный вызов прогресса
OverwriteboolfalseПерезаписать существующий файл
ResumeDownloadboolfalseВключить докачку
Checksumstring""Ожидаемое значение контрольной суммы
ChecksumAlgorithmChecksumAlgorithm"sha256"Алгоритм контрольной суммы

DownloadProgressCallback

go
type DownloadProgressCallback func(downloaded, total int64, speed float64)
ПараметрТипОписание
downloadedint64Количество загруженных байт
totalint64Общее количество байт (-1 если неизвестно)
speedfloat64Текущая скорость (байт/сек)
go
cfg.ProgressCallback = func(downloaded, total int64, speed float64) {
    pct := float64(downloaded) / float64(total) * 100
    fmt.Printf("\r%.1f%% (%s)", pct, httpc.FormatSpeed(speed))
}

DownloadResult

go
type DownloadResult struct {
    FilePath        string
    BytesWritten    int64
    Duration        time.Duration
    AverageSpeed    float64
    StatusCode      int
    ContentLength   int64
    Resumed         bool
    ResponseCookies []*http.Cookie
    ActualChecksum  string
    Proto           string
    ResponseHeaders http.Header
    RequestURL      string
    RequestMethod   string
    RequestHeaders  http.Header
}
ПолеТипОписание
FilePathstringПуть сохранения файла
BytesWrittenint64Количество записанных байт
Durationtime.DurationВремя загрузки
AverageSpeedfloat64Средняя скорость (байт/сек)
StatusCodeintHTTP-код состояния
ContentLengthint64Значение заголовка Content-Length
ResumedboolЗавершена ли докачка
ResponseCookies[]*http.CookieCookie ответа
ActualChecksumstringФактическая контрольная сумма
ProtostringВерсия HTTP-протокола (например "HTTP/1.1", "HTTP/2.0")
ResponseHeadershttp.HeaderЗаголовки ответа
RequestURLstringФактический URL запроса
RequestMethodstringHTTP-метод запроса
RequestHeadershttp.HeaderЗаголовки запроса
go
fmt.Printf("Загрузка завершена: %s, время %v, средняя скорость %s\n",
    httpc.FormatBytes(result.BytesWritten),
    result.Duration,
    httpc.FormatSpeed(result.AverageSpeed),
)

TIP

Используйте FormatBytes и FormatSpeed, чтобы получить человекочитаемые строки байт и скорости и не выполнять вручную пересчёт по основанию 1024.

Проверка контрольной суммы

ChecksumAlgorithm

go
type ChecksumAlgorithm string

Алгоритм проверки целостности загруженного файла.

КонстантаЗначениеОписание
ChecksumSHA256"sha256"Алгоритм хеширования SHA-256

Пример использования

go
cfg := httpc.DefaultDownloadConfig()
cfg.FilePath = "/tmp/package.tar.gz"
cfg.Checksum = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
cfg.ChecksumAlgorithm = httpc.ChecksumSHA256

result, err := httpc.Download(context.Background(), url, cfg)
if err != nil {
    // При несовпадении контрольной суммы автоматически возвращается ошибка и удаляется загруженный файл
    log.Fatal(err)
}
fmt.Println("Контрольная сумма:", result.ActualChecksum)

TIP

При установке Checksum после завершения загрузки автоматически проверяется целостность файла. При несовпадении файл автоматически удаляется и возвращается ошибка, ручное сравнение не требуется.

Защита безопасности

Загрузка файлов включает многоуровневую защиту:

ЗащитаОписание
Блокировка UNC-путейЗапрет путей формата \\server\share
Фильтрация управляющих символовЗапрет управляющих символов в пути
Защита системных путейЗапрет записи в системные каталоги
Обнаружение обхода путиОбнаружение обхода пути ../
Обнаружение символических ссылокПредотвращение атак через символические ссылки
Проверка родительских каталоговРекурсивная проверка символических ссылок родительских каталогов

Докачка

go
cfg := httpc.DefaultDownloadConfig()
cfg.FilePath = "/tmp/large-file.zip"
cfg.ResumeDownload = true

result, err := httpc.Download(context.Background(), url, cfg)
if result.Resumed {
    fmt.Println("Докачка завершена")
}

Механизм докачки:

  1. Проверка размера локального файла → используется как смещение запроса Range
  2. Сервер возвращает 206 (Partial Content) → дозапись
  3. Сервер возвращает 416 (Range Not Satisfiable) → возврат ошибки
  4. Сервер возвращает 200 (Range не поддерживается) → возврат ошибки (защита локального частичного файла от перезаписи)

См. также