Reference server implementation in Go of tus: the open protocol for resumable file uploads
Go to file
mrezai e89661cbda Fix README sample code errors
Closes https://github.com/tus/tusd/pull/87
2017-01-04 21:30:40 +01:00
.hooks Add pre-create hook for validation before upload creation 2016-07-11 22:40:19 +02:00
.infra Pin Frey as a dependency vs installing latest globally 2016-12-20 13:42:06 +01:00
.scripts Drop support for testing on Go1.4 on Travis 2016-12-20 17:25:24 +01:00
cmd/tusd Count multiple closed connectios only once 2017-01-04 20:47:34 +01:00
consullocker Document functions for handling StoreComposers 2016-03-11 20:17:43 +01:00
filestore Use platform-independent paths inside file storage 2017-01-04 20:25:08 +01:00
limitedstore Format code in limitedstore 2016-10-13 16:46:03 +02:00
memorylocker Correct linting issue and misspellings 2016-09-27 22:10:16 +02:00
prometheuscollector Allow exposing metrics for Prometheus and Co. 2016-05-24 17:04:28 +02:00
s3store Define own, minimal S3API interface 2016-12-20 17:13:02 +01:00
uid Correct linting issue and misspellings 2016-09-27 22:10:16 +02:00
vendor Use personal fork of nightlyone/filelock 2016-09-30 12:03:49 +02:00
.gitignore Also ignore dev env keys 2016-09-30 12:54:22 +02:00
.travis.yml Drop support for testing on Go1.4 on Travis 2016-12-20 17:25:24 +01:00
LICENSE.txt rewrite tusd 2015-02-01 14:57:57 +01:00
README.md Fix README sample code errors 2017-01-04 21:30:40 +01:00
appveyor.yml Install dependencies on Appveyor 2016-09-20 15:05:44 +02:00
composer.go Document functions for handling StoreComposers 2016-03-11 20:17:43 +01:00
composer.mgo Document functions for handling StoreComposers 2016-03-11 20:17:43 +01:00
composer_test.go Use memorylocker in example for composer 2016-09-30 01:14:52 +02:00
concat_test.go Add tests for various invalid header values 2016-10-13 19:03:18 +02:00
config.go Correct linting issue and misspellings 2016-09-27 22:10:16 +02:00
config_test.go Add tests for Config structure 2016-03-11 20:46:34 +01:00
cors_test.go Refactor remaining tests to subtest style 2016-10-13 18:08:34 +02:00
datastore.go Correct linting issue and misspellings 2016-09-27 22:10:16 +02:00
doc.go Add documentation about using tusd 2016-03-04 22:13:13 +01:00
get_test.go Add test for accessing unimplemented methods 2016-10-13 18:48:46 +02:00
handler.go Embed UnroutedHandler into Handler 2016-03-12 22:01:12 +01:00
handler_mock_test.go Add test for FinisherDataStore 2016-10-13 18:18:18 +02:00
head_test.go Add tests for locking in various situations 2016-10-13 18:33:33 +02:00
log.go Add proper, formatted logging 2016-09-23 21:21:38 +02:00
metrics.go Correct linting issue and misspellings 2016-09-27 22:10:16 +02:00
options_test.go Refactor remaining tests to subtest style 2016-10-13 18:08:34 +02:00
patch_test.go Add tests for various invalid header values 2016-10-13 19:03:18 +02:00
post_test.go Add tests for various invalid header values 2016-10-13 19:03:18 +02:00
subtest_go17_test.go Enable subtests for environments prior to Go 1.7 2016-10-13 12:29:13 +02:00
subtest_test.go Improve output of subtests when emulated 2016-10-13 12:59:11 +02:00
terminate_test.go Add test for accessing unimplemented methods 2016-10-13 18:48:46 +02:00
unrouted_handler.go Add test for attempting empty download 2016-10-13 18:38:43 +02:00
utils_test.go Add comments to test utilities 2016-10-14 11:52:51 +02:00

README.md

tusd

Tus logo

tus is a protocol based on HTTP for resumable file uploads. Resumable means that an upload can be interrupted at any moment and can be resumed without re-uploading the previous data again. An interruption may happen willingly, if the user wants to pause, or by accident in case of an network issue or server outage.

tusd is the official reference implementation of the tus resumable upload protocol. The protocol specifies a flexible method to upload files to remote servers using HTTP. The special feature is the ability to pause and resume uploads at any moment allowing to continue seamlessly after e.g. network interruptions.

Protocol version: 1.0.0

Getting started

You can download ready-to-use packages including binaries for OS X, Linux and Windows in various formats of the latest release.

Compile from source

Requirements:

  • Go (1.5 or newer)

Running tusd from source:

Clone the git repository and cd into it.

git clone git@github.com:tus/tusd.git
cd tusd

Now you can run tusd:

go run cmd/tusd/main.go

Using tusd manually

Besides from running tusd using the provided binary, you can embed it into your own Go program:

package main

import (
	"fmt"
	"net/http"

	"github.com/tus/tusd"
	"github.com/tus/tusd/filestore"
)

func main() {
	// Create a new FileStore instance which is responsible for
	// storing the uploaded file on disk in the specified directory.
	// This path _must_ exist before tusd will store uploads in it.
	// If you want to save them on a different medium, for example
	// a remote FTP server, you can implement your own storage backend
	// by implementing the tusd.DataStore interface.
	store := filestore.FileStore{
		Path: "./uploads",
	}

	// A storage backend for tusd may consist of multiple different parts which
	// handle upload creation, locking, termination and so on. The composer is a
	// place where all those seperated pieces are joined together. In this example
	// we only use the file store but you may plug in multiple.
	composer := tusd.NewStoreComposer()
	store.UseIn(composer)

	// Create a new HTTP handler for the tusd server by providing a configuration.
	// The StoreComposer property must be set to allow the handler to function.
	handler, err := tusd.NewHandler(tusd.Config{
		BasePath:      "/files/",
		StoreComposer: composer,
	})
	if err != nil {
		panic(fmt.Errorf("Unable to create handler: %s", err))
	}

	// Right now, nothing has happened since we need to start the HTTP server on
	// our own. In the end, tusd will start listening on and accept request at
	// http://localhost:8080/files
	http.Handle("/files/", http.StripPrefix("/files/", handler))
	err = http.ListenAndServe(":8080", nil)
	if err != nil {
		panic(fmt.Errorf("Unable to listen: %s", err))
	}
}

Please consult the online documentation for more details about tusd's APIs and its sub-packages.

Implementing own storages

The tusd server is built to be as flexible as possible and to allow the use of different upload storage mechanisms. By default the tusd binary includes filestore which will save every upload to a specific directory on disk.

If you have different requirements, you can build your own storage backend which will save the files to S3, a remote FTP server or similar. Doing so is as simple as implementing the tusd.DataStore interface and using the new struct in the configuration object. Please consult the documentation about detailed information about the required methods.

Packages

This repository does not only contain the HTTP server's code but also other useful tools:

  • s3store: A storage backend using AWS S3
  • filestore: A storage backend using the local file system
  • memorylocker: An in-memory locker for handling concurrent uploads
  • consullocker: A locker using the distributed Consul service
  • limitedstore: A storage wrapper limiting the total used space for uploads

Running the testsuite

Build Status Build status

go test -v ./...

FAQ

How can I access tusd using HTTPS?

The tusd binary, once executed, listens on the provided port for only non-encrypted HTTP requests and does not accept HTTPS connections. This decision has been made to limit the functionality inside this repository which has to be developed, tested and maintained. If you want to send requests to tusd in a secure fashion - what we absolutely encourage, we recommend you to utilize a reverse proxy in front of tusd which accepts incoming HTTPS connections and forwards them to tusd using plain HTTP. More information about this topic, including sample configurations for Nginx and Apache, can be found in issue #86.

License

This project is licensed under the MIT license, see LICENSE.txt.