Я использую принудительную загрузку, чтобы загружать в основном zip и mp3 файлы на сайте, который я сделал (http://pr1pad.kissyour.net) - для отслеживания загрузок в Google Analytics, в базе данных и для скрытия реального пути загрузки:
Это так:
extending CI model
... - bunch of code
function _fullread ($sd, $len) {
$ret = '';
$read = 0;
while ($read < $len && ($buf = fread($sd, $len - $read))) {
$read += strlen($buf);
$ret .= $buf;
}
return $ret;
}
function download(){
/* DOWNLOAD ITSELF */
ini_set('memory_limit', '160M');
apache_setenv('no-gzip', '1');
ob_end_flush();
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public",FALSE);
header("Content-Description: File Transfer");
header("Content-type: application/octet-stream");
if (isset($_SERVER['HTTP_USER_AGENT']) &&
(strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false))
header('Content-Type: application/force-download'); //IE HEADER
header("Accept-Ranges: bytes");
header("Content-Disposition: attachment; filename=\"" . basename("dir-with- files/".$filename) . "\";");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . filesize("dir-with-files/".$filename));
// Send file for download
if ($stream = fopen("dir-with-files/$filename", 'rb')){
while(!feof($stream) && connection_status() == 0){
//reset time limit for big files
set_time_limit(0);
print($this->_fullread($stream,1024*16));
flush();
}
fclose($stream);
}
}
Это на LAMP с CI 1.7.2 - это мой собственный метод, собранный из различных инструкций по всему интернету, потому что во время разработки возникали следующие проблемы:
- ограничение сервера . ini_set
не помогло, поэтому я использовал буферизованный _fullread
вместо обычного fread
, который был использован вместо @readonly
- ob_end_flush (), потому что сайт сделан в CI1.7.2 и мне нужно очистить буфер
Теперь ... Это не работает. Это произошло, потом перестало показывать ожидаемый размер / время загрузки - я пытался очистить его, и пока я чистил код, что-то случилось, я не знаю, что и в любой предыдущей версии - это не работал (никаких изменений в настройках) - edit : не работать = выводит все в окно браузера.
Итак, я сказал, прикрути его, я посмотрю здесь.
Итак, я в основном ищу скрипт или функцию, которую я могу поместить в свою выходную модель и сделаю:
- Вызов принудительной загрузки (в начале Chrome
скачать, в IE, FF, Safari открыть
модальное открытие / сохранение / отмена)
- Показать размер файла и приблизительное время (это зависит от браузера, я знаю, но сначала браузер должен знать размер файла
- РАБОТА (проверено и подтверждено!) В IE6,7,8, FF3, Opera, Chrome и Safari на ПК + Mac (Linux ... мне все равно) - это часть заголовка
- на сервере, у меня есть что-то вроде лимита памяти 56 МБ, к которому я не могу добавить, поэтому это тоже важно
Заранее спасибо.
Редактировать : Теперь я чувствую себя не в своей тарелке больше, чем когда-либо / раньше, так как я пытался принудительно загрузить с помощью .htaccess - пока он работал, у него было мало мелких / основных (выберите ваши) проблем
- показывал полный путь (минор для меня)
- он ожидает завершения полной загрузки (отображается как «соединение»), а затем просто показывает, что он загружается - и загружается за одну секунду (для меня главное)
Теперь, хотя я удалил .htaccess, он все еще ждет, пока загрузка не будет завершена (как если бы он сначала загружал в кэш), и он просто получает connected
и показывает диалог открытия / сохранения.