SSSsshhhhhh...

Get Hidden Files Now!
Securely serve files stored in your ExpressionEngine site - even those embedded within Channel Entries or in Grid fields - via protected download links, rather than exposing them publicly.

Hidden Files enhances your site’s security posture by preventing direct file URL exposure. It offers a clean and manageable way to serve files dynamically within your templates, while retaining control over who can download them and when.

Summary

Feature Details
Purpose Secure controlled downloads of files associated with entries or Grid fields
Template Tag {exp:hidden_files:download_link}
Notification Method Email, with customizable recipients and alert criteria
Output Variables {hidden_files:url}, {hidden_files:title}
Context Parameters entry_id, field, field_id, col, row_id, file_id
Grid Support Yes - handles downloads from within Grid fields

Features

  • Allows for download of files stored within Channel Entries and as stand alone Files.
  • Works with the File field type even within Grid fields.

Protected File Downloads

  • Allows files added through the File field type or standalone files to be downloaded securely—not accessible via direct public URLs.

Grid Support

  • Works seamlessly with files stored inside Grid fields—a powerful feature if you organize content using nested structures.

Typical Use Cases

Secure File Sharing

  • Offer downloads of resources—PDFs, reports, images—only to authorized users, without exposing raw file URLs.

Content in Grid Fields

  • When managing media inside Grid-based layouts (e.g., multiple images per post), generate controlled access with ease.

Custom Download Workflows

  • Integrate with templates to style download links—use icons, labels, or button designs to match your site layout.

Simple Documentation

  • Hidden Files is pretty simple to implement.

Template Tags

There's only one template tag

download_link

Generates a link for users to download a file

Variables
  • {hidden_files:url} The full URL to download the file
  • {hidden_files:title} The title assocaited with the File (if any)
Parameters
  • entry_id The entry the file is associated with
  • field The short name for the field the file is assigned
  • field_id The actual ID for the field. Improves performance.
  • col For Grid columns, the column the file is assigned
  • row_id For Grid columns, The specific row the file is assigned (usually {row_id})
  • file_id The specific file to download. No other params needed when used.
Examples

Channel Entry

{exp:hidden_files:download_link entry_id="{entry_id}" field="test_file"}
	<p><a href="{hidden_files:url}">Download {hidden_files:title}</a></p>
{/exp:hidden_files:download_link}

Grid

{exp:hidden_files:download_link entry_id="{entry_id}" field_id="4" col="image" row_id="{blog_image:row_id}"}
	<p><a href="{hidden_files:url}">Download {hidden_files:title}</a></p>
{/exp:hidden_files:download_link}

File

{exp:hidden_files:download_link file_id="1"}
	<p><a href="{hidden_files:url}">Download {hidden_files:title}</a></p>
{/exp:hidden_files:download_link}

Requirements

  1. ExpressionEngine >= 7.4
  2. PHP >= 8.0
  3. Extensions Enabled