Командная утилита для загрузки и скачивания файлов через сервисы, совместимые с Firefox Send.
- Загрузка файлов и директорий (директории автоматически архивируются в
.tar.gz). - Скачивание и расшифровка файлов по URL, с поддержкой указания директории сохранения и перезаписи.
- End-to-end потоковое шифрование и дешифрование данных с использованием протокола Encrypted Content-Encoding (ECE), совместимое с протоколом Firefox Send.
- Автоматический подбор подходящего инстанса для загрузки на основе лимитов размера, срока хранения и количества скачиваний.
Готовые aвтобилды под amd64 и arm64 для Linux, Windows, MacOS:
страница последнего релиза для загрузки
- Git: https://git-scm.com/downloads
- Go версии 1.18 или выше: https://go.dev/dl
клонирование этого репо, переход в его папку и настройка зависимостей проекта:
git clone --depth 1 https://github.com/imbecility/ffsendgo
cd ffsendgo
go mod tidyCGO_ENABLED=0 go build -ldflags="-s -w -extldflags '-static' -X 'main.buildTime=$(go run ./cli/tools/buildtime.go)'" -trimpath -o ./build/ffsendgo ./cliset CGO_ENABLED=0; go build -ldflags="-s -w -extldflags '-static' -X 'main.buildTime=$(go run ./cli/tools/buildtime.go)'" -trimpath -o ./build/ffsendgo.exe ./cliИсполняемый файл будет в папке build.
Утилита автоматически определяет действие в зависимости от типа переданного аргумента: путь к файлу/директории для загрузки или URL для скачивания.
----------------------------------------------------------------------------
использование:
ffsendgo.exe [-host <url>] [-all] <путь | [-overwrite] [-output] URL>
программа автоматически определяет действие:
- если передан путь к файлу или папке, начнется их выгрузка.
- если передан URL на файл FFSend, начнется скачивание в текущую рабочую
директорию.
----------------------------------------------------------------------------
флаги:
-all [bool: (по умолчанию 'false')]
выгрузка на все подходящие инстансы которые найдет программа
-host [string: (по умолчанию '')]
свой конкретный URL инстанса FFSend для выгрузки
-output [string: (по умолчанию '')]
папка для сохранения файла
-overwrite [bool: (по умолчанию 'false')]
перезаписать файл если он уже существует
-version [bool: (по умолчанию 'false')]
версия программыДля загрузки необходимо указать путь к файлу или директории.
# Общий шаблон
./ffsendgo [flags] <путь_к_файлу_или_директории>Флаги для загрузки:
-host <url>: Использовать конкретный URL инстанса FFSend для загрузки.-all: Загрузить файл на все подходящие инстансы, найденные программой.
Загрузка файла archive.zip с автоматическим выбором лучшего инстанса:
./ffsendgo ./archive.zipЗагрузка директории project_docs на указанный инстанс:
./ffsendgo --host https://send.mni.li ./project_docsДля скачивания необходимо указать полный URL файла.
# Общий шаблон
./ffsendgo [flags] <URL>Флаги для скачивания:
-overwrite: Перезаписать локальный файл, если он уже существует.-output <папка>: Указать директорию для сохранения файла.
Скачивание файла по URL в текущую директорию:
./ffsendgo "https://send.example.com/download/abcdef123456/#secretkey..."Скачивание файла в директорию /tmp/downloads с принудительной перезаписью:
./ffsendgo --overwrite --output /tmp/downloads "https://send.example.com/download/abcdef123456/#secretkey..."package main
import (
"log"
"github.com/imbecility/ffsendgo"
)
func main() {
// ...
// выгрузка файла/папки
fileOrFolderPath := "/path/to/something"
customProviderUrl := "" // можно указать свой инстанс, или не указывать ничего для авто-подбора (nil или "")
multiUpload := false // для выгрузки на все доступные инстансы
if err := ffsendgo.Uploader(fileOrFolderPath, &customProviderUrl, &multiUpload); err != nil {
log.Fatal(err.Error())
}
// скачивание файла
downloadUrl := "https://ffsend-instance.host/download/12a345bc67890123/#ab12CDEF34GHKl56mnOpQRsTuVW"
overwriteExistsFile := true // перезаписывать файлы на диске если уже есть с тем же именем
destinationFolder := "/folder/path/or/nil" // nil или строка с путем, будет создана папка если не существует
if err := ffsendgo.DownloadFile(downloadUrl, &overwriteExistsFile, &destinationFolder); err != nil {
log.Fatal(err.Error())
}
// ...
}