Categorygithub.com/HalloTschuess/very-simple-upload-server
repositorypackage
0.0.0-20230421212622-a67388d8a23c
Repository: https://github.com/hallotschuess/very-simple-upload-server.git
Documentation: pkg.go.dev

# README

very-simple-upload-server

This is a very simple upload server supporting GET, PUT and DELETE.

Tags

  • latest
  • alpine
  • {version}
  • {version}-alpine

Usage

Run with persistence on port 80:

docker run -v my_volume:/uploads -p 80:80 hallotschuess/very-simple-upload-server

Change base URL-path:

docker run -v my_volume:/uploads -p 80:80 -e URL_BASE_PATH=/my-base-path/ hallotschuess/very-simple-upload-server

Environment Variables

VariableDefaultDescription
AUTH_HEADERAuthorizationHeader where to find a token
AUTH_HEADER_PREFIXBearer Prefix of header (note the space after Bearer)
DEBUGfalseEnable debug log messages
LISTEN:80Internal address and port to listen on
LOG_FORMATtext modeLogging format: json logfmt else text mode
ROOT_DIR/uploadsRoot directory for uploaded files
TOKEN_DELETEToken for DELETE method
TOKEN_GETToken for GET method
TOKEN_PUTToken for PUT method
URL_BASE_PATH/Base path for URL
FORCE_DIGESTfalseForce the use of a digest for file uploads

Upload

You can upload a file using the PUT method to the specified location.
The server stores a formfile under the key file.
If the key is absent, the server uses the request body as the file content.
The filename is not considered, only the URL-path matters.
If a file already exists at the location, it will be overwritten.

When uploading, a temporary file is created in the same directory as the destination file.
If an error occurs, the temporary file is cleaned up. The destination file will not be created/updated.

Examples:

Create a file test.txt with content Hello world:

curl -X PUT -H "Content-Type: text/plain" -d "Hello world" example.com/test.txt

Upload ./my/file.jpg as /some/dir/my-picture.jpg:

curl -X PUT -F "file=@my/file.jpg" example.com/some/dir/my-picture.jpg

You can use the Digest header to verify file integrity.
Supported hashing functions are MD5 and SHA-256.
All provided digest values are evaluated.

curl -X PUT -H "Content-Type: text/plain" -H "Digest: md5=PiWWCnnbxptnTNTsZ6csYg==,sha-256=ZOyIygCyaOW6GjVnihtTFtIS9PNmskdyMlNKiuyjfzw=" -d "Hello world" example.com/test.txt

Delete

You can delete a file or directory (recursively) with DELETE.
Empty folders are automatically removed.

curl -X DELETE example.com/test.txt

Security

Notice: CORS is always enabled: Access-Control-Allow-Origin: *.

The server implements a very simple token auth per method.
You can pass the token either as a token query parameter or via a header defined by AUTH_HEADER and AUTH_HEADER_PREFIX.
If a token is provided both ways, the query parameter takes precedence.
By default, the header is Authorization the token is format Bearer <token>.

Example:
To restrict access to PUT requests, set the environment variable TOKEN_PUT to your desired token.
Now you have to specify this token with your request parameters.

curl -X PUT -F "file=@my/file.jpg" example.com/some/dir/my-picture.jpg?token={your-token}

OR

curl -X PUT -F "file=@my/file.jpg" -H "Authorization: Bearer {your-token}" example.com/some/dir/my-picture.jpg