From 16666c261b6983c304c77cf898f895785a72349b Mon Sep 17 00:00:00 2001 From: Reinhold Kainhofer <reinhold@kainhofer.com> Date: Sun, 17 Nov 2013 00:14:23 +0100 Subject: [PATCH] ersion 1.5.4: Fix large downloads, -) Send file size in http header -) Check if the file exists and is readable on disk -) Don't flush the queue before trying to change the header (will break if the header was already set before) --- downloads_for_sale.php | 10 +++++----- downloads_for_sale/tmpl/product_compact.php | 2 +- ...plg_vmcustom_downloads_for_sale_v1.5.4.zip | Bin 26477 -> 26497 bytes 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/downloads_for_sale.php b/downloads_for_sale.php index 5738b69..d7f6ccf 100644 --- a/downloads_for_sale.php +++ b/downloads_for_sale.php @@ -184,16 +184,16 @@ class plgVmCustomDownloads_for_Sale extends vmCustomPlugin { JFactory::getApplication()->enqueueMessage(JText::sprintf('VMCUSTOM_DLSALE_ERROR_MEDIA_NOT_CONFIGURED', $media_id), 'error'); return false; } - flush(); - ob_flush(); + if (!is_file($media->file_url) || !is_readable($media->file_url)) { + JFactory::getApplication()->enqueueMessage(JText::sprintf('VMCUSTOM_DLSALE_ERROR_NO_FILE_SET', $media_id, $media->file_url), 'error'); + return false; + } header("Content-Type: " . $media->file_mimetype); header("Content-Disposition: attachment; filename=\"".JFile::getName($media->file_url)."\""); + header("Content-Length: ".filesize($media->file_url)); if (@$this->readfile_chunked($media->file_url)) { return true; } else { - header_remove("Content-Type"); - header_remove("Content-Disposition"); - JFactory::getApplication()->enqueueMessage(JText::sprintf('VMCUSTOM_DLSALE_ERROR_NO_FILE_SET', $media_id, $media->file_url), 'error'); return false; } } else { diff --git a/downloads_for_sale/tmpl/product_compact.php b/downloads_for_sale/tmpl/product_compact.php index b96ef00..ec4758f 100644 --- a/downloads_for_sale/tmpl/product_compact.php +++ b/downloads_for_sale/tmpl/product_compact.php @@ -11,4 +11,4 @@ defined('_JEXEC') or die(); ?> -<p><img style="vertical-align:middle; display: inline;" src="<?php echo JURI::root().VMDLSALE_PLUGINWEBROOT.'/downloads_for_sale/assets/download_small.png'; ?>" alt=""/> <a href="<?php echo $viewData[0]; ?>"><?php echo $viewData[2]->file_title; ?></a></p> +<p><img style="vertical-align:middle; display: inline;" src="<?php echo JURI::root().VMDLSALE_PLUGINWEBROOT.'/downloads_for_sale/assets/download_small.png'; ?>" alt=""/> <a href="<?php echo $viewData[0]; ?>"><?php echo $viewData[2]->file_title; ?></a></p> diff --git a/releases/plg_vmcustom_downloads_for_sale_v1.5.4.zip b/releases/plg_vmcustom_downloads_for_sale_v1.5.4.zip index 019ca0909ab9bc5e8e84b078318e9ddfce9237d1..61d87f92a084c4ea51b262c0575b3a30088716c7 100644 GIT binary patch delta 6978 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 UrpZix5W_RsF<p&KDi&ld0D|Z`9RL6T delta 6932 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 U0P~6%5L<e(XSxv^TP(;f0LcwJ5C8xG -- GitLab