Skip to content
On this page

Directus Cloud

Everything you need to start building. Provisioned in 90 seconds. Starting at $15/month.

Get Started

Accessing Files

The FilesService provides access to upload, import, and perform CRUD operations on files.

js
export default defineEndpoint((router, context) => {
  const { services, getSchema } = context;
  const { FilesService } = services;

  router.get('/', async (req, res) => {
    const filesService = new FilesService({
      schema: await getSchema(),
      accountability: req.accountability
    });

    // Your route handler logic
  });
});
export default defineEndpoint((router, context) => {
  const { services, getSchema } = context;
  const { FilesService } = services;

  router.get('/', async (req, res) => {
    const filesService = new FilesService({
      schema: await getSchema(),
      accountability: req.accountability
    });

    // Your route handler logic
  });
});

Import a File

js
router.post('/', async (req, res) => {
  const filesService = new FilesService({
    schema: await getSchema(),
    accountability: req.accountability
  });

  const assetKey = await filesService.importOne({
    url: file_url,
    data: file_object,
  });

  const data = await filesService.readOne(assetKey);

  res.json(data);
});
router.post('/', async (req, res) => {
  const filesService = new FilesService({
    schema: await getSchema(),
    accountability: req.accountability
  });

  const assetKey = await filesService.importOne({
    url: file_url,
    data: file_object,
  });

  const data = await filesService.readOne(assetKey);

  res.json(data);
});

Upload a File

Uploading a file requires the use of an external dependency called Busboy, a streaming parser for Node.js. Import it at the top of your file as:

js
import Busboy from 'busboy'
import Busboy from 'busboy'

Create the route to upload a file:

js
router.post('/', async (req, res, next) => {
  const filesService = new FilesService({
    schema: await getSchema(),
    accountability: req.accountability,
  });

  const busboy = Busboy({ headers: req.headers });

  busboy.on('file', async (_, fileStream, { filename, mimeType }) => {

    const data = {
      filename_download: filename,
      type: mimeType,
      storage: 'local',
    };

    try {
      const primaryKey = await filesService.uploadOne(fileStream, data);
      res.json({ id: primaryKey });
    } catch (error) {
      busboy.emit('error', error);
    }
  });

  busboy.on('error', (error) => {
    next(error);
  });

  req.pipe(busboy);
});
router.post('/', async (req, res, next) => {
  const filesService = new FilesService({
    schema: await getSchema(),
    accountability: req.accountability,
  });

  const busboy = Busboy({ headers: req.headers });

  busboy.on('file', async (_, fileStream, { filename, mimeType }) => {

    const data = {
      filename_download: filename,
      type: mimeType,
      storage: 'local',
    };

    try {
      const primaryKey = await filesService.uploadOne(fileStream, data);
      res.json({ id: primaryKey });
    } catch (error) {
      busboy.emit('error', error);
    }
  });

  busboy.on('error', (error) => {
    next(error);
  });

  req.pipe(busboy);
});

The File Object

Refer to the full list of properties the file can have in our documentation.

Read a File

js
router.get('/', async (req, res) => {
  const filesService = new FilesService({
    schema: await getSchema(),
    accountability: req.accountability
  });

  const data = await filesService.readOne('file_id');

  res.json(data);
});
router.get('/', async (req, res) => {
  const filesService = new FilesService({
    schema: await getSchema(),
    accountability: req.accountability
  });

  const data = await filesService.readOne('file_id');

  res.json(data);
});

Update a File

js
router.patch('/', async (req, res) => {
  const filesService = new FilesService({
    schema: await getSchema(),
    accountability: req.accountability
  });

  const data = await filesService.updateOne('file_id', { title: 'Random' });

  res.json(data);
});
router.patch('/', async (req, res) => {
  const filesService = new FilesService({
    schema: await getSchema(),
    accountability: req.accountability
  });

  const data = await filesService.updateOne('file_id', { title: 'Random' });

  res.json(data);
});

Delete a File

js
router.delete('/', async (req, res) => {
  const filesService = new FilesService({
    schema: await getSchema(),
    accountability: req.accountability
  });

  const data = await filesService.deleteOne('file_id');

  res.json(data);
});
router.delete('/', async (req, res) => {
  const filesService = new FilesService({
    schema: await getSchema(),
    accountability: req.accountability
  });

  const data = await filesService.deleteOne('file_id');

  res.json(data);
});

Explore FilesService In-Depth

Refer to the full list of methods in our codebase.