diff options
Diffstat (limited to 'sites/all/modules/media_gallery/media.pages.inc')
-rw-r--r-- | sites/all/modules/media_gallery/media.pages.inc | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/sites/all/modules/media_gallery/media.pages.inc b/sites/all/modules/media_gallery/media.pages.inc new file mode 100644 index 000000000..940714756 --- /dev/null +++ b/sites/all/modules/media_gallery/media.pages.inc @@ -0,0 +1,60 @@ +<?php + +/** + * @file + * This file provieds media specific functions. + */ + + +/** + * @todo Move this code to the Media module's media.pages.inc file when it is + * ready to be committed to CVS. + */ + +/** + * Menu callback; prompt the browser to download the file. + * + * This function is very similar to file_download(). Its primary difference is + * to force the Content-Disposition header to 'attachment', even for images and + * other file types that could normally be displayed by the browser. This is + * useful for "Download" links. + * + * By invoking hook_file_download() and checking access as file_download() does, + * this function is compatible with public and private files as well as other + * custom URI schemes that may be in use. + * + * @see file_download() + */ +function media_download($file) { + $uri = $file->uri; + $scheme = file_uri_scheme($uri); + if (file_stream_wrapper_valid_scheme($scheme) && file_exists($uri)) { + // Let other modules provide headers and controls access to the file. + // module_invoke_all() uses array_merge_recursive() which merges header + // values into a new array. To avoid that and allow modules to override + // headers instead, use array_merge() to merge the returned arrays. + $headers = array(); + foreach (module_implements('file_download') as $module) { + $function = $module . '_file_download'; + $result = $function($uri); + if ($result == -1) { + return drupal_access_denied(); + } + if (isset($result) && is_array($result)) { + $headers = array_merge($headers, $result); + } + } + // Default Content-Type and Content-Length headers, in case no other + // hook_file_download() implementation set them. + $name = mime_header_encode($file->filename); + $type = mime_header_encode($file->filemime); + $headers += array( + 'Content-Type' => $type . '; name="' . $name . '"', + 'Content-Length' => $file->filesize, + ); + // Force the Content-Disposition header, regardless of what other + // hook_file_download() implementations normally set. + $headers['Content-Disposition'] = 'attachment; filename="' . $name . '"'; + file_transfer($uri, $headers); + } +} |