Edit this page

File Field

The File fields stores a file using Keystone Storage and a Storage Adapter (e.g. FS, S3, etc). You have to configure a Storage instance first then provide it in the options for the field, e.g.

Storage adapters are built per field. Look up the documentation on the individual adapters.

var storage = new keystone.Storage({
    adapter: keystone.Storage.Adapters.FS,
    fs: {
        path: 'uploads',
        publicPath: '/public/uploads/',
    }
});
MyList.add({
    file: { type: Types.File, storage: storage }
});

The field stores a nested Object in the model. The nested schema is based on the schema provided by the Storage Adapter, which for the FS adapter defaults to:

{
    filename: String,
    size: Number,
    mimetype: String,
    path: String,
    originalname: String,
    url: String,
}

Different adapters may add additional paths to the field schema - see the documentation for the Adapter you're using for more information.

Updates

file.updateItem(item, data, files, ({ err }) => { /* done */ })

The update method requires an item, update data, files and a callback. files is optional unless a file is being uploaded.

Update data must be an object containing a value with the field's path (can be nested or flattened). Uploaded files must be provided in the files argument (which is securely provided by Multer when processing requests) and referenced in the value of the field.

The examples below are based on updating an item with the following List configuration:

MyList.add({
    file: { type: Types.File, storage: storage }
});

Update the field value

file.updateItem(item, {
    file: {
        filename: 'xyz123.jpg',
        size: '43233',
        mimetype: 'image/jpeg',
        path: '/public/uploads',
        originalname: 'photo.jpg',
        url: '/uploads/xyz123.jpg',
    }
});

Upload a new file (result will be stored in the field)

To upload a new file, you can use either updateItem, or you can use the upload method below.

file.updateItem(item, {
    // data object contains a reference to a path in the files object
    file: 'upload:az12xy89',
}, {
    // files object contains file fields as processed by multer
    az12xy89: {
        originalname,
        mimetype,
        size,
        path,
    }
});

The path option is the only required option when you're uploading, and it must be the path of the file stored on the server to upload to your storage provider.

Remove the file

To delete the stored file and reset the field value, provide the string "remove":

{
    file: 'remove',
}

Reset the field value

To reset the field value without deleting the stored file, provide an empty / null value:

{
    file: '',
}

Methods

upload

This method uploads a file using your storage provider. You can call it directly on the list:

List.fields.fieldName.upload({
    path: '/path/to/temporary/file.txt',
}, (err) => { /* done */ });

or you can call it using an underscore method on an item:

item._.fieldName.upload({
    path: '/path/to/temporary/file.txt',
}, (err) => { /* done */ });

The options parameter can accept any options that are passed in normally by multer. It expects at a minimum the path property when you're uploading; the other fields are optional. A full example object looks like this:

{
    filename: 'xyz123.jpg',
    size: '43233',
    mimetype: 'image/jpeg',
    path: '/public/uploads',
    originalname: 'photo.jpg',
    url: '/uploads/xyz123.jpg',
}

There is no way to upload directly from a buffer at the moment, you must upload from a file.

remove

Calls the removeFile on the storage adapter provided.

reset

Resets all fields in the storage schema.