Skip to content

eventials/go-tus

Repository files navigation

go-tus Build Status Go Report Card GoDoc

A pure Go client for the tus resumable upload protocol

Example

package main

import (
    "os"
    "github.com/eventials/go-tus"
)

func main() {
    f, err := os.Open("my-file.txt")

    if err != nil {
        panic(err)
    }

    defer f.Close()

    // create the tus client.
    client, _ := tus.NewClient("https://tus.example.org/files", nil)

    // create an upload from a file.
    upload, _ := tus.NewUploadFromFile(f)

    // create the uploader.
    uploader, _ := client.CreateUpload(upload)

    // start the uploading process.
    uploader.Upload()
}

Example with resume

package main

import (
	"fmt"
	"os"
	"time"

	"github.com/eventials/go-tus"
	"github.com/eventials/go-tus/memorystore"
)

func main() {
	// Open the file
	file, err := os.Open(`/path/to/your/file.txt`)
	if err != nil {
		panic(err)
	}
	defer file.Close()
	// Create a MemoryStore also can be LeveldbStore or you can implement your own store
	store, err := memorystore.NewMemoryStore()
	if err != nil {
		panic(err)
	}
	// Create a Client
	client, err := tus.NewClient("http://tus.example.org/files/", &tus.Config{
		Resume:    true,    // Important to resume uploads
		Store:     store,   // Important to resume uploads
		ChunkSize: 4 << 20, // 4 Mb
	})
	if err != nil {
		panic(err)
	}
	// (Optional) Create a chan to notify upload status
	uploadChan := make(chan tus.Upload, 1)
	go func() {
		for uploadStatus := range uploadChan {
			// Print the upload status
			fmt.Printf("Completed %v%% %v Bytes of %v Bytes\n",
				uploadStatus.Progress(),
				uploadStatus.Offset(),
				uploadStatus.Size())
		}
	}()
	// Create new upload
	upload, err := tus.NewUploadFromFile(file)
	if err != nil {
		panic(err)
	}
	// Declare number of attempts
	const attemps = 50
	for i := 1; i <= attemps; i++ {
		fmt.Printf("Attemp %v of %v\n", i, attemps)
		// Create an uploader
		uploader, err := client.CreateOrResumeUpload(upload)
		if err != nil {
			fmt.Println("Error", err)
			fmt.Println("Trying again in 10 seg")
			time.Sleep(time.Second * 10)
			continue
		}
		// (Optional) Notify Upload Status
		uploader.NotifyUploadProgress(uploadChan)
		// Start upload to server
		err = uploader.Upload()
		if err != nil {
			fmt.Println("Error", err)
			fmt.Println("Trying again in 10 seg")
			time.Sleep(time.Second * 10)
			continue
		}
		break
	}
	// If after all attemps there's an error panic!
	if err != nil {
		panic(err)
	}
	fmt.Println("Finished!")
}

Features

This is not a full protocol client implementation.

Checksum, Termination and Concatenation extensions are not implemented yet.

This client allows to resume an upload if a Store is used.

Built in Store

Store is used to map an upload's fingerprint with the corresponding upload URL.

Name Backend Dependencies
MemoryStore In-Memory None
LeveldbStore LevelDB goleveldb

Future Work

  • SQLite store
  • Redis store
  • Memcached store
  • Checksum extension
  • Termination extension
  • Concatenation extension

About

A pure Go client for the tus resumable upload protocol

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 14