← Back to list

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…

Suraj Kumar · 2026-04-03 04:04 · 0 claps · 2.9 min read
#angular #kendo-ui #dotnet-core #files #zip
Open on Medium ↗
Wiki topics: 🌐 · Web Development 💑 · Relationships

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