File service

The file service in graviton is reachable at the /file/ endpoint. It was developed as a catch-all solution to clients file storage needs.

Graviton file services are backed by either machine local storage or an S3 bucket depending on your deploy.

Clients may use the service to store assets like images or also to store content generated by customers.

Since the file service operates on files of all kinds of MIME-types and also stores metadata on one single endpoint it has a larger than usual surface.

For further information about file service please visit: FileBundle

Usage

Upload a file

Create and upload a simple text file as follows.

echo "Hallo Graviton" > test.txt

curl -v -X POST -H "Content-Type: text/plain" \
    -T'{test.txt}' https://example.org/file

Observe the Location header in the output from the POST request. It tells you where the file was stored and has the following format:

Location: /file/55bb584a08420b5f288b457c

Retrieve file and metadata

Get the files contents by issuing a GET request with the corresponding MIME-type.

curl -H "Accept: text/plain" \
    https://example.org/file/55bb584a08420b5f288b457c

Or get the accompanying metadata by requesting JSON data.

curl -H "Accept: application/json" \
    https://example.org/file/55bb584a08420b5f288b457c

Update file metadata

When updating files it is important to remember that you should always base your edits on the original data.

You need to specify a JSON MIME-type to update the files metadata.

curl -H "Accept: application/json" \
    https://example.org/file/55bb584a08420b5f288b457c > test.json
    
# Edit test.json in vim and add metadata.filename and some links

curl -v -X PUT -H "Content-Type: application/json" \
    -T'{test.json}' https://example.org/file/55bb584a08420b5f288b457c

If you try to edit any of the read only data in the resource graviton will complain with an error and reject the updated data.

The following fields are read only and get updated by graviton as needed.

  • metadata.createData
  • metadata.modificationDate
  • metadata.size
  • metadata.mime

Update file content

To update a file you will need to send the corresponding MIME-type headers.

curl -v -X PUT -H "Content-Type: text/plain" \
    -T'{test.txt}' https://example.org/file/55bb584a08420b5f288b457c

Upload File and Metadata in one go

By introducing the content-type multipart/form-data it is now possible to send the file and the metadata in one PUT or POST request. Since this is basically a form submit the information is send as form fields:

  • metadata » use for the metadata formerly sent as payload in step 2
  • upload » use to send the file to be stored
curl -X POST \
     -F 'metadata={"links":[],"metadata": {"action":[{"command":"print"},{"command":"archive"}]}}' \
     -F upload=@test.txt \
     https://example.org/file
curl -X PUT \
     -F 'metadata={"id": "myPersonalFile","links":[],"metadata": {"action":[{"command":"print"},{"command":"archive"}]}}' \
     -F upload=@test.txt \
     https://example.org/file/myPersonalFile

Both PUT and POST request will not accept more than one file to be uploaded. In case multiple files are sent only the first file will be recognized. The set of readonly metadata fields is extend by the field: filename, which will now be set by graviton.

Example data (annotated)

{
    "id": "55bb584a08420b5f288b457c",
    // array of links that may point to any other resource
    "links": [
        {
            // URL of linked resource
            "$ref": "https://example.org/person/customer/123",
            // link 'type', it is up to the clients to define the types they want to use
            "type": "owner"
        },
        {
            "$ref": "https://example.org/core/module/123", 
            "type": "module"
        }
    ], 
    "metadata": {
        // read only fields in metadata get managed by the server
        // createData is such a field and gets set to the time of the initial upload
        "createDate": "2015-08-06T10:51:20+0000",
        // name for display purposes, may be updated by user
        "filename": "fileName.txt",
        // read only and inferred from the uploaded file
        "mime": "text/plain",
        // read only and set when a file is replaced
        "modificationDate": "2015-08-06T10:51:20+0000",
        // read only and inferred from the upload
        "size": 12,
        // key/value store for additional properties. Also used for add information for printing and archiving
        "additionalProperties": [
            {"name": "propertyName", "value": "aValue"},
            {"name": "secondProp", "value": "otherValue"}
        ]
    }
}

Please reference the schema for more details on the data format of the file service.