In-memory
A very simple in-memory filesystem is available which is only accessible via HTTP under /memfs. Use the POST or PUT method with the path to that file. The body of the request contains the contents of the file. No particular encoding or Content-Type is required. The file can then be downloaded from the same path.
This filesystem is practical for often changing data (e.g. HLS live stream) in order not to stress the disk or to wear out a flash drive. Also you don't need to setup a RAM drive or similar on your system.
curl http://127.0.0.1:8080/memfs/path/to/a/file.txt -X PUT -d @somefile.txtcurl http://127.0.0.1:8080/memfs/path/to/a/file.txt -o file.txtcurl http://127.0.0.1:8080/memfs/path/to/a/file.txt -X DELETEThe returned Content-Type is based solely on the file extension. For a list of known mime-types and their extensions see storage.mime_types in the configuration.
Access protection
It is strongly recommended to enable a username/password (HTTP Basic-Auth) protection for any PUT/POST and DELETE operations on /memfs. GET operations are not protected.
By default HTTP Basic-Auth is enabled with the username "admin" and a random password.
Writes or overwrites a file on the memory filesystem
Path to file
Created
No Content
Insufficient Storage
PUT /memfs/{path} HTTP/1.1
Host: /
Authorization: Basic username:password
Content-Type: application/data
Accept: */*
Content-Length: 3
[
1
]textRemove a file from the memory filesystem
Path to file
OK
Not Found
DELETE /memfs/{path} HTTP/1.1
Host: /
Authorization: Basic username:password
Accept: */*
textExample:
Use these endpoints to, e.g., store HLS chunks and .m3u8 files (in contrast to an actual disk or a ramdisk):
ffmpeg -f lavfi -re -i testsrc2=size=640x480:rate=25 -c:v libx264 -preset:v ultrafast -r 25 -g 50 -f hls -start_number 0 -hls_time 2 -hls_list_size 6 -hls_flags delete_segments+temp_file+append_list -method PUT -hls_segment_filename http://127.0.0.1:8080/memfs/foobar_%04d.ts -y http://127.0.0.1:8080/memfs/foobar.m3u8Then you can play it generally with, e.g.,
ffplay http://127.0.0.1:8080/memfs/foobar.m3u8.
API
The contents of the /memfs are also accessible via the API in the same way as described above, but with the same protection as the API (see API-Security configuration) for all operations. It is also possible to list all files that are currently in the filesystem.
Create, Update
Example:
echo 'test' > example.txt && \
curl http://127.0.0.1:8080/api/v3/fs/mem/example.txt \
-d @example.txt \
-X PUTfrom core_client import Client
client = Client(base_url="http://127.0.0.1:8080")
client.login()
client.v3_fs_put_file(
name: "mem",
path: "example.txt",
data: b"test"
)import (
"strings"
"github.com/datarhei/core-client-go/v16"
)
client, _ := coreclient.New(coreclient.Config{
Address: "https://127.0.0.1:8080",
})
data := strings.NewReader("test")
err := client.FilesystemAddFile("mem", "/example.txt", data)The contents for the upload has to be provided as an io.Reader.
After the successful upload the file is available at /memfs/example.txt and /api/v3/fs/mem/example.txt.
Description:
Writes or overwrites a file on the memory filesystem
Path to file
Created
No Content
Insufficient Storage
PUT /api/v3/fs/mem/{path} HTTP/1.1
Host: /
Authorization: YOUR_API_KEY
Content-Type: application/data
Accept: */*
Content-Length: 3
[
1
]textRead
List all files
Listing all currently stored files is done by calling /api/v3/fs/mem. It also accepts the query parameters pattern, sort (name, size, or lastmod) and order (asc or desc). If none of the parameters are given, all files will be listed sorted by their last modification time in ascending order.
With the pattern parameter you can filter the list based on a glob pattern, with the addition of the ** placeholder to include multiple subdirectories, e.g. listing all .ts file in the root directory has the pattern /*.ts, listing all .ts file in the whole filesystem has the pattern /**.ts.
Example:
curl "http://127.0.0.1:8080/api/v3/fs/mem?sort=name&order=asc" \
-X GETfrom core_client import Client
client = Client(base_url="http://127.0.0.1:8080")
client.login()
core_memfs_list = client.v3_fs_get_file_list(name="mem")
print(core_memfs_list)import (
"fmt"
"github.com/datarhei/core-client-go/v16"
)
client, _ := coreclient.New(coreclient.Config{
Address: "https://127.0.0.1:8080",
})
files, err := client.FilesystemList("mem", "/*.", coreclient.SORT_NAME, coreclient.ORDER_ASC)
for _, file := range files {
fmt.Printf("%+v\n", file)
}Description:
List all files on the memory filesystem. The listing can be ordered by name, size, or date of last modification in ascending or descending order.
glob pattern for file names
none, name, size, lastmod
asc, desc
OK
GET /api/v3/fs/mem HTTP/1.1
Host: /
Authorization: YOUR_API_KEY
Accept: */*
OK
[
{
"last_modified": 1,
"name": "text",
"size_bytes": 1
}
]Download a file
For downloading a file you have to specify the complete path and filename. The Content-Type will always be application/data.
Example:
curl http://127.0.0.1:8080/api/v3/fs/mem/example.txt \
-X GETfrom core_client import Client
client = Client(base_url="http://127.0.0.1:8080")
client.login()
core_memfs_file = client.v3_fs_get_file(
name="mem",
path="example.txt"
)
print(core_memfs_file)import (
"github.com/datarhei/core-client-go/v16"
)
client, _ := coreclient.New(coreclient.Config{
Address: "https://127.0.0.1:8080",
})
data, err := client.FilesystemGetFile("mem", "/example.txt")
defer data.Close()The returned data is an io.ReadCloser.
Description:
Fetch a file from the memory filesystem
Path to file
OK
Moved Permanently
Not Found
GET /api/v3/fs/mem/{path} HTTP/1.1
Host: /
Authorization: YOUR_API_KEY
Accept: */*
textLink
Linking a file will return a redirect to the linked file. The target of the redirect has to be in the body of the request.
Example:
curl http://127.0.0.1:8080/api/v3/fs/mem/example2.txt \
-d 'example.txt'
-X PATCHMissed.This is not implemented in the client.
Description:
Create a link to a file in the memory filesystem. The file linked to has to exist.
Path to file
Created
Bad Request
PATCH /api/v3/fs/mem/{path} HTTP/1.1
Host: /
Authorization: YOUR_API_KEY
Content-Type: application/data
Accept: */*
Content-Length: 6
"text"textDelete
For deleting a file you have to specify the complete path and filename.
Example:
curl http://127.0.0.1:8080/api/v3/fs/mem/example.txt \
-X DELETEfrom core_client import Client
client = Client(base_url="http://127.0.0.1:8080")
client.login()
client.v3_fs_delete_file(
name="mem",
path="example.txt"
)import (
"github.com/datarhei/core-client-go/v16"
)
client, _ := coreclient.New(coreclient.Config{
Address: "https://127.0.0.1:8080",
})
err := client.FilesystemDeleteFile("mem", "/example.txt")Description:
Remove a file from the memory filesystem
Path to file
OK
Not Found
DELETE /api/v3/fs/mem/{path} HTTP/1.1
Host: /
Authorization: YOUR_API_KEY
Accept: */*
textConfiguration
In-memoryLast updated
Was this helpful?
