Binary Files
RESTHeart offers complete binary files management. It’s possible to create, read and delete even huge files. RESTHeart makes use of MongoDB’s GridFS, a specification for storing and retrieving files that exceed the BSON-document size limit of 16 MB.
You can read more about GridFS here.
Create a File Bucket
File buckets are special collections whose aim is to store binary data and the associated metadata. Start by creating a new one for uploading binaries.
|
Note
|
A file bucket name must end with .files (e.g. mybucket.files is a valid file bucket name)
|
Create the default restheart database, if none exists yet:
Create the file bucket.
PUT /mybucket.files HTTP/1.1
HTTP/1.1 201 Created
Upload a file with POST
POST /bucket.files is used to insert a file.
|
Note
|
the request body must be encoded as multipart/form-data. This is obtained in the following example with the --form option in the http command
|
The following example request POSTs the binary image example.jpg with {"author":"SoftInstigate"} metadata into /mybucket.files
With httpie:
$ http -a admin:secret --form POST localhost:8080/mybucket.files @/path/to/my/binary/example.jpg metadata='{"author":"SoftInstigate", "filename": "example.jpg"}'
HTTP/1.1 201 Created
Location: http://localhost:8080/mybucket.files/5e5fcdd8ddfa017301e00331
(other response headers omitted)
With curl:
$ curl -i -X POST -u admin:secret --form metadata='{"author":"SoftInstigate", "filename": "example.jpg"}' --form file= @/path/to/my/binary/example.jpg localhost:8080/mybucket.files
HTTP/1.1 201 Created
Location: http://localhost:8080/mybucket.files/5e5fcdd8ddfa017301e00331
(other response headers omitted)
curl -i -X POST -u admin:secret --form metadata='{"filename":"hello.json"}' --form file=@/tmp/hello2.json localhost:8080/my.files
The Location HTTP header returns the file’s URI. The last part is the _id.
|
Note
|
file bucket does not support write mode. The POST verb is always an insert. If an _id is specified in the request content and a file with this _id already exists, the request will fail with status code 409 Conflict
|
Upsert a file with PUT
PUT /bucket.files/fileid is used to upsert a file.
|
Note
|
the request body must be encoded as multipart/form-data. This is obtained in the following example with the --form option in the http command
|
With httpie:
$ http -a admin:secret --form PUT localhost:8080/mybucket.files/example @/path/to/my/binary/example.jpg metadata='{"author": "SoftInstigate", "filename": "example.jgp"}'
HTTP/1.1 201 Created
With curl:
$ curl -i -X PUT -u admin:secret --form metadata='{"author":"SoftInstigate", "filename": "example.jpg"}' --form file=@/path/to/my/binary/example.jpg localhost:8080/mybucket.files/example
HTTP/1.1 201 Created
|
Note
|
file bucket does not support write mode. The PUT verb is always an upsert. If the file exists, it will be updated (response code 200 Ok) otherwise it will be created (response code 201 Created)
|
GET the file metadata
The file metadata is returned with GET /bucket.files and GET /bucket.files/fileid requests.
GET http://localhost:8080/mybucket.files/example HTTP/1.1
{
"_id": "example.jpg",
"chunkSize": 261120,
"filename": "example.jgp",
"length": 66273,
"metadata": {
"_etag": {
"$oid": "5e5fcdd8ddfa017301e00330"
},
"author": "SoftInstigate",
"contentType": "image/jpeg",
"filename": "example.jgp"
},
"uploadDate": {
"$date": 1583336920114
}
}
|
Important
|
the file contentType is automatically detected by RESTHeart and used to define the Content-Type response header.
|
|
Note
|
Uploaded files metadata can be filtered and treated as regular collection documents. For example, http://localhost:8080/mybucket.files?filter={"metadata.author":"SoftInstigate"} returns all the file metadata that satisfy the query.
|
GET the file binary data
The binary content is available by appending /binary to the file URI:
GET http://localhost:8080/mybucket.files/example/binary HTTP/1.1
Update file metadata
PUT /bucket.files/docid and PATCH /bucket.files/docid are used to update the file metadata.
|
Important
|
to update the metadata, use a normal requests with Content-Type: application/json. This differ from upserting a file that uses a multi-part request, i.e. Content-Type: multipart/form-data
|
The following request, adds the two field foo and bar to the file metadata.
PATCH http://localhost:8080/mybucket.files/example HTTP/1.1
{
"foo": 1,
"bar": 2
}
The following request replaces the whole file metadata with the given document:
PUT http://localhost:8080/mybucket.files/example HTTP/1.1
{
"author": "uji"
}
|
Note
|
update operators and update aggregation pipelines cannot be used in files updates. |