Bulk File Download from a Kendo Grid: Why It’s a Back-end Problem (and How to Solve It Right?)
In many enterprise applications, users work with a grid that lists documents — reports, attachments, logs, bills, or uploaded files. Very…
Bulk File Download from a Kendo Grid: Why It’s a Back-end Problem (and How to Solve It Right?)
In many enterprise applications, users work with a grid that lists documents — reports, attachments, logs, bills, or uploaded files. Very quickly, a common request emerges:
“Can we add a Download All button to the grid and get everything as a ZIP?”
If you’re using Kendo UI Grid, the first instinct is to look for a built‑in option or configuration flag. Spoiler alert: there isn’t one.
And that’s not a limitation — it’s a design decision.
In this post, I’ll explain:
- Why Kendo Grid doesn’t (and shouldn’t) support ZIP downloads
- The correct architectural approach
- A clean, scalable implementation pattern used in real-world systems
What Kendo Grid Can and Cannot Do?
Kendo Grid is a presentation and interaction component, not a file‑processing engine.
What It Does Well?
- Render file metadata (name, size, type, status)
- Support row selection (single / multiple)
- Expose toolbar and custom action buttons
- Trigger client-side events and API calls
What It Does Not Do?
- Aggregate files
- Read binary content
- Compress files into ZIP format
- Access file systems or object storage
There is no native feature in Kendo Grid like: “Download all rows as ZIP”
Why ZIP Creation Should Never Be Done in the UI?
Let’s look at what actually happens when users want a ZIP download:
- Multiple files must be fetched
- Authorization needs to be checked
- Files might reside in DB, file server, Blob storage, or S3
- Compression is CPU‑intensive
- Large downloads need streaming
- Failures must be handled safely
None of this belongs in the browser.
Bulk ZIP creation is a back-end responsibility.
Any attempt to do this purely on the client side results in:
- Memory issues
- Poor performance
- Security gaps
- Browser crashes for large datasets
The Correct Architecture (Industry Standard)
Here’s the clean and scalable pattern:

Kendo Grid’s responsibility ends at selection and intent.
Sequence Diagram

Step 1: Kendo Grid — Capturing User Intent
From the grid, you can support:
- Download all files
- Download selected files
Typically implemented using:
- Multi‑row selection
- A custom toolbar button (e.g., “Download as ZIP”)
What the UI sends to the back-end:
- File identifiers (IDs, keys, or references)
- Nothing more
Example payload:
{
"fileIds": [101, 102, 103, 104]
}
Step 2: Back-End API — Creating the ZIP (Core Logic)
This is where the real work happens.
Back-end responsibilities:
- Validate user authorization
- Fetch files from storage
- Create ZIP archive
- Stream the ZIP to the client
Example (.NET — Simplified)
using var outputStream = new MemoryStream();
using (var zip = new ZipArchive(outputStream, ZipArchiveMode.Create, true))
{
foreach (var file in files)
{
var entry = zip.CreateEntry(file.FileName);
using var entryStream = entry.Open();
entryStream.Write(file.Content);
}
}
outputStream.Position = 0;
return File(
outputStream,
"application/zip",
"DownloadedFiles.zip"
);
This approach:
- Works for small and medium datasets
- Keeps ZIP creation server‑side
- Ensures security and audit ability
For large downloads, this can be extended using streaming or background jobs.
Step 3: Triggering the Download from Kendo Grid
On the front-end, the grid simply triggers the request and handles the response as a blob.
Example (Type-Script):
interface DownloadZipRequest {
fileIds: number[];
}
function downloadZip(selectedIds: number[]) {
fetch("/api/files/download-zip", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({ fileIds: selectedIds })
})
.then(res => res.blob())
.then(blob => {
const link = document.createElement("a");
link.href = URL.createObjectURL(blob);
link.download = "Files.zip";
link.click();
});
}
The browser handles the download — no hacks required.
Why This Design Works Well?
Scalable Works whether you have 5 files or 500.
Secure All access checks happen server‑side.
Maintainable UI and backend responsibilities are clearly separated.
Extensible You can later add:
- Audit logging
- Rate limiting
- File size limits
Final Thoughts
When designing file downloads, especially bulk downloads, resist the temptation to push logic into the UI. UI libraries are about interaction — not heavy processing.
Let the grid be a grid. Let the back-end do the heavy lifting.
메타데이터
- post_id
- 8d27db3c9fd5
- slug
- bulk-file-download-from-a-kendo-grid-why-its-a-back-end-problem-and-how-to-solve-it-right-8d27db3c9fd5
- url
- https://medium.com/@er.srj789/bulk-file-download-from-a-kendo-grid-why-its-a-back-end-problem-and-how-to-solve-it-right-8d27db3c9fd5
- canonical_url
- https://medium.com/@er.srj789/bulk-file-download-from-a-kendo-grid-why-its-a-back-end-problem-and-how-to-solve-it-right-8d27db3c9fd5
- author_url
- https://medium.com/@er.srj789
- status
- ok
- fetched_at
- 2026-06-20 20:29:01