Pack a list of Directus files from their UUIDs into a ZIP file and save it to Directus Assets.
- ✅ Works inside Directus Backend (Extensions) and outside via REST API
- ✅ Support for multiple storage drivers (local, S3, etc.)
- ✅ TypeScript support
- ✅ Configurable compression
- ✅ Error handling and validation
npm install @devix-tecnologia/directus-file-zip
or
pnpm add @devix-tecnologia/directus-file-zip
Set your Directus access token in your .env
file:
DIRECTUS_ACCESS_TOKEN=your_access_token_here
PUBLIC_URL=http://localhost:8055 # Your Directus instance URL
Note: The access token must have proper permissions to read files and create new assets.
Use this approach when creating Directus extensions or hooks:
import { directusZipFiles } from '@devix-tecnologia/directus-file-zip';
export default defineEndpoint((router, ctx) => {
router.get('/', async (req, res) => {
try {
// Get all files from Directus storage
const { FilesService } = ctx.services;
const filesService = new FilesService({
schema: req.schema,
});
const files = await filesService.readByQuery({});
const fileIds = files.map((file) => file.id);
// Create ZIP file
const compressedId = await directusZipFiles(
fileIds,
'compressed.zip',
'My Compressed Files',
{
ApiExtensionContext: ctx,
storage: 'local', // or 's3', 'gcs', etc.
},
);
res.json({
success: true,
fileId: compressedId,
message: 'ZIP file created successfully',
});
} catch (error) {
res.status(500).json({
success: false,
error: error.message,
});
}
});
});
Use this approach for external applications or scripts:
import { directusZipFiles } from '@devix-tecnologia/directus-file-zip';
async function createZipFile() {
try {
const config = {
accessToken: process.env.DIRECTUS_ACCESS_TOKEN!,
baseURL: process.env.PUBLIC_URL || 'http://localhost:8055',
};
const fileIds = [
'6e710d5b-1d2b-43f6-941a-32e74d9808b9',
'8b710d5b-1d2b-43f6-941a-32e74d9808c5',
];
const uploadedFileId = await directusZipFiles(
fileIds,
'my-archive.zip',
'Archive Files',
config,
);
console.log('ZIP file created with ID:', uploadedFileId);
return uploadedFileId;
} catch (error) {
console.error('Error creating ZIP:', error);
throw error;
}
}
// Usage
createZipFile();
Parameter | Type | Required | Description |
---|---|---|---|
fileIds |
string[] |
✅ | Array of Directus file UUIDs to include in ZIP |
filename |
string |
✅ | Name of the ZIP file (with .zip extension) |
title |
string |
✅ | Title/description for the file in Directus |
config |
Config |
✅ | Configuration object (see below) |
For Backend Extensions:
{
ApiExtensionContext: DirectusExtensionContext;
storage?: string; // Storage driver name (default: 'local')
}
For REST API:
{
accessToken: string; // Directus access token
baseURL: string; // Directus instance URL
}
Promise<string>
: UUID of the created ZIP file in Directus
- Node.js 18+
- Docker and Docker Compose
- pnpm (recommended) or npm
-
Start Directus instance:
docker compose up -d
-
Configure Directus:
- Go to Directus Admin Panel (http://localhost:8055)
- Create an admin user
- Generate an access token with file permissions
-
Set environment variables:
cp .env.example .env # Edit .env and add your DIRECTUS_ACCESS_TOKEN
-
Install dependencies:
pnpm install
-
Run tests:
pnpm test # Run all tests pnpm lint # Check code formatting pnpm typecheck # Check TypeScript types
pnpm build # Build the package
pnpm clean # Clean build artifacts
pnpm format # Format code with Prettier
pnpm lint # Check code formatting
pnpm typecheck # TypeScript type checking
pnpm test # Run tests with Vitest
This project is licensed under the MIT License - see the LICENSE file for details.
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add some amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
- Roberto Seba - roberto@robertoseba.com - @robertoseba
- Sidarta Veloso - sidartaveloso@gmail.com - @sidartaveloso
Made with ❤️ by Devix Tecnologia.