Skip to content

Repository files navigation

Seafile stream upload

Upload large files to Seafile with low memory usage. The file is split into parts and streamed; on Seafile you get several part files plus an MD5 check file.

Scripts overview

Script Purpose Typical use
seafile-upload-stream.py Upload a single large file in chunks (parts). One big file (e.g. backup, image); avoids server upload-size limits. Result on Seafile: file.part_000, file.part_001, …, file.md5, file.json. Resume supported.
seafile-upload-dir.py Upload a local folder recursively; each file in one piece. Many files or whole directory trees. Resume: skips already uploaded files (same size).
seafile-download-dir.py Download a remote folder from Seafile recursively. Mirror or backup a library folder. Resume: skips already downloaded files. Option --merge to join stream-upload parts locally.

All scripts use the Seafile Repo-Token API (Seafile 13+). Config via .env or environment variables (see .env-example).

Prerequisites

  • Python 3
  • Seafile 13 or later
  • Repo-Token of the library (in Seafile: Library → Advanced → API Token)

Usage

Optionally create and activate a virtual environment so dependencies stay isolated:

python3 -m venv venv
source venv/bin/activate   # Windows: venv\Scripts\activate
pip install -r requirements.txt
# Copy .env-example to .env and set SEAFILE_REPO_TOKEN (and optionally other vars)
cp .env-example .env
# Or export manually:
# export SEAFILE_REPO_TOKEN=your_repo_token
python seafile-upload-stream.py /path/to/large/file

Scripts load variables from a .env file in the current directory if present (see .env-example for all options). Environment variables still override .env.

Resume (continue after interruption)

If the script is interrupted (Ctrl+C, crash, network error), only some parts may be on Seafile; the .md5 file will be missing.

  • Progress: A progress file is created next to the file being uploaded (<file>.seafile-upload.progress). It records up to which part the upload has progressed.
  • Simply run again: On the next run with the same file, the script detects progress and uploads only the missing parts (no re-upload from part 0). Then it creates and uploads the .md5 file and removes the progress file.
  • Same file: Resume applies only to the same file (same absolute path and file size). For a different file or changed content, the script starts again at part 0.

Restoring the file (joining the parts)

On Seafile the file remains as multiple parts (e.g. file.part_000, file.part_001, …) and a check file file.md5. There is no server-side merge; joining is done locally after download:

  1. Download all part files (file.part_*) and the file file.md5 from the Seafile library into one local folder (web UI, Seafile client or API).
  2. In the terminal in that folder, concatenate the parts in order:
    cat file.part_* > file
    (file.part_* is sorted alphabetically, so the order is correct.)
  3. Verify integrity with the included MD5 file:
    md5sum -c file.md5
    Expected output: file: OK

On macOS (no md5sum): run md5 -r file and compare the shown hash with the contents of file.md5.


Upload folder to Seafile (recursive, full-size)

The script seafile-upload-dir.py uploads all files from a local folder recursively to Seafile – each file in one piece (no part splitting). For single very large files, use seafile-upload-stream.py instead.

export SEAFILE_REPO_TOKEN=your_repo_token
# Upload contents of ./my_folder to /data (or SEAFILE_TARGET_DIR)
python seafile-upload-dir.py ./my_folder

# Specify target folder on Seafile explicitly
python seafile-upload-dir.py ./my_folder /target/path

Resume: Already uploaded files (same size) are skipped on the next run. Progress file: .seafile-upload-dir.progress in the source folder (removed when done).

400 Bad Request: The script retries once with a fresh upload link (tokens expire, often after ~1 h). Other causes: upload link was obtained for a different path than parent_dir, or server-side limits (file size, request size). On 400 the script prints the server response body to help diagnose.

Download folder from Seafile

The script seafile-download-dir.py downloads folder contents recursively (also via Repo-Token API). Resume: After an interruption, already fully downloaded files (same size) are skipped on the next run; the target folder contains a progress file .seafile-download.progress, which is removed when the download is complete.

export SEAFILE_REPO_TOKEN=your_repo_token
# Default: remote path from SEAFILE_REMOTE_DIR (or /data), output into current directory
python seafile-download-dir.py

# Remote folder and local output via options
python seafile-download-dir.py --seafile-path /data --output-folder ./local_folder

Options: --seafile-path (remote folder, default from env SEAFILE_REMOTE_DIR or /data), --output-folder (local directory, default .). To merge part files after download without a token: --merge <dir> <basename>.


Docker

Build the image:

docker build -t seafile-upload .

Config is via environment variables. Pass them with --env-file (e.g. a local .env; do not commit secrets):

Stream upload (mount the file, pass path inside container):

docker run --rm --env-file .env -v /host/path/to/file:/data seafile-upload seafile-upload-stream.py /data/yourfile

Upload directory (mount local folder):

docker run --rm --env-file .env -v /host/my_folder:/data seafile-upload seafile-upload-dir.py /data /target

Download directory (mount target folder):

docker run --rm --env-file .env -v /host/output:/out seafile-upload seafile-download-dir.py --seafile-path /data --output-folder /out

Merge part files (no env-file or token needed; mount folder that contains the .part_* files):

docker run --rm -v /host/folder_with_parts:/data seafile-upload seafile-download-dir.py --merge /data myfile

This writes the merged file to /data/myfile (i.e. /host/folder_with_parts/myfile on the host) and removes the part files. Verify with md5sum -c myfile.md5 inside the container or on the host.

If the mounted path is read-only, set SEAFILE_PROGRESS_DIR=/tmp (or a writable volume) so progress files are stored there instead of next to the file or in the folder.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages