Форумы-->Форум для внеигровых тем--> 1|2
Автор | Помощь php сепциалиста |
Нужна прямая ссылка на скачивание файла
Есть некий сайт, на котором есть ссылка вида:
AnySite.ru/download/?file=file.zip
При нажатии в браузере открывается окошко сохранения или открытия файла file.zip
При закачке файловым менеджером сохраняется страничка noname.html
Как это работает?
Как скачать такой прайс файловым менеджером? | Ответ firebug - примерно такой: "Перезагрузите страницу для получения результата" | Content-Type: application/octet-stream | ща погодь, | [php]
// +-------------------------------------------------------------------------------------------+
// | Блок для закачки с сервера |
// +-------------------------------------------------------------------------------------------+
if(isset($_GET['filename'])) {
if (!file_exists($filename = $_GET['filename'])){
print "Файл " . $filename . "не найден!\r\n";
}
else {
set_time_limit(0);
header('HTTP/1.0 200 OK');
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
header('Content-Transfer-Encoding: binary');
header('Accept-Ranges: bytes');
header('Content-Length: ' . (filesize($filename)));
header('Content-Type: application/x-rar-compressed');
@readfile($filename);
}
}
// +-------------------------------------------------------------------------------------------+
[/php]
[html]
<a href="путь к странице с сценарием?filename=путь к файлу">Скачать</a>
[/html] | а теперь и функция :)
[php]
<?php
/**
* Функция для скачивания файла с сервера с возможностью докачки,
* требует предварительной установки ограничения времени выполнения сценария
*
* @param string $realFilePath
* @return bool
*/
function downloadFile($realFilePath) {
// вначале проверим, что файл существует
if(!file_exists($realFilePath)) {
return false;
}
// соберем необходимую информацию о файле
$CLen = filesize($realFilePath);
$filename = basename($realFilePath); // запрашиваемое имя
$file_extension = strtolower(substr(strrchr($filename, '.'), 1));
// Краткий перечень mime-типов
$fileCType = 'application/octet-stream';
$CTypes = array (
'pdf' => 'application/pdf',
'exe' => 'application/octet-stream',
'zip' => 'application/x-zip-compressed',
'rar' => 'application/x-rar-compressed',
'doc' => 'application/msword',
'xls' => 'application/vnd.ms-excel',
'ppt' => 'application/vnd.ms-powerpoint',
'gif' => 'image/gif',
'png' => 'image/png',
'jpe' => 'jpeg',
'jpg' => 'image/jpg'
);
// Если расширение есть в перечне, присвоим соответствующий mime тип,
// иначе остается общий
if(isset($CTypes[$file_extension])) {
$fileCType = $CTypes[$file_extension];
}
// Формируем HTTP-заголовки ответа
// $_SERVER['HTTP_RANGE'] — номер байта, c которого надо возобновить передачу содержимого файла.
// проверим, что заголовок Range: bytes=range- был послан браузером или менеджером закачек
if(isset($_SERVER['HTTP_RANGE'])) {
$matches = array(); | if(preg_match('/bytes=(\d+)-/', $_SERVER['HTTP_RANGE'], $matches)) {
$rangePosition = intval($matches[1]);
$newCLen = $CLen - $rangePosition;
header ( 'HTTP/1.1 206 Partial content', true, 200 );
header ( 'Status: 206 Partial content' );
// Last-Modified - Дата послднего изменения содержимого. Поле актуально только для
// статических страниц. Apache заменяет это поле значением поля Date для динамически
// генерируемых страниц, в том числе для страниц содержащих SSI.
header ( 'Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');// always modified
// HTTP/1.1
// Cache-control: no-cache - Управление кэш. Значение no-cache определяет запрет кэш
// данной страницы. Для версии протокола HTTP/1.0 действует "Pragma: no-cache".
header ( 'Cache-Control: no-store, no-cache, must-revalidate ');
header ( 'Cache-Control: post-check=0, pre-check=0', false);
// HTTP/1.0
header ( 'Pragma: no-cache' );
header ( 'Accept-Ranges: bytes');
header ( 'Content-Range: bytes ' . $rangePosition . '-' . $CLen - 1 . '/' . $CLen);
header ( 'Content-Length: ' . $newCLen );
header ( 'Content-Disposition: attachment; filename="' . $filename . '"' );
header ( 'Content-Description: File Transfer' );
header ( 'Content-Type: ' . $fileCType );
header ( 'Content-Transfer-Encoding: binary');
}
else {
return false;
}
}
else {
header ( 'HTTP/1.1 200 OK', true, 200 );
header ( 'Status: 200 OK' );
// Last-Modified - Дата послднего изменения содержимого. Поле актуально только для
// статических страниц. Apache заменяет это поле значением поля Date для динамически
// генерируемых страниц, в том числе для страниц содержащих SSI.
header ( 'Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');// always modified
// HTTP/1.1
// Cache-control: no-cache - Управление кэш. Значение no-cache определяет запрет кэш
// данной страницы. Для версии протокола HTTP/1.0 действует "Pragma: no-cache".
header ( 'Cache-Control: no-store, no-cache, must-revalidate ');
header ( 'Cache-Control: post-check=0, pre-check=0', false);
// HTTP/1.0
header ( 'Pragma: no-cache' );
header ( 'Accept-Ranges: bytes');
header ( 'Content-Length: ' . $CLen );
header ( 'Content-Disposition: attachment; filename="' . $filename . '"' );
header ( 'Content-Description: File Transfer' );
header ( 'Content-Type: ' . $fileCType );
header ( 'Content-Transfer-Encoding: binary');
$rangePosition = 0;
}
// теперь необходимо встать на позицию $rangePosition и выдать в поток содержимое файла
$handle = @fopen($realFilePath, 'rb');
if ($handle) {
fseek($handle, $rangePosition);
while(!feof($handle) and !connection_status()) {
print fread($handle, (1024 * 8));
}
return true;
}
else {
return false;
}
}
?>
[/php] | Если не дурак - разберешься, если иначе, адаптируй код, удачи ;) | для __DestroyeR__:
При нажатии в браузере открывается окошко сохранения или открытия файла file.zip
При закачке файловым менеджером сохраняется страничка noname.html
у него либо не тот MIME-type отдается, либо заглушка потому что сервак видит USER-AGENT не браузеровский, а качалку
а ты ему хрень предлагаешь | для __DestroyeR__:
поднять php сервер для того, чтобы скачивать 1 файл с 1 сайта прямой ссылкой?
нет, спасибо...
а кто-то объяснить может, откуда скачивает браузер файл, если изначально прямой ссылки на скачивание нет? | ну так подробности нужны, а то, дайте скрипт, чтобы файл качать | и причем тут php программист? Если всего то нужно, менеджер найти? | для __DestroyeR__:
ссылка в лп
менеджер есть - download master
я не понимаю как фунциклирует php, откуда браузер берет файл, если прямой ссылки скачивания нет | для erros:
как бы тебе объяснить, из кеша грубо говоря | и в конечном счете, когда я получу прямую ссылку на скачивание, я буду качать средствами vba excel
как можно скачать файл, если прямая ссылка на скачивание не дана? | для __DestroyeR__:
из кеша не пойдет: вчера этот файл один, а завтра он другой. нужны актуальные данные непосредственно с сайта | я не понимаю как фунциклирует php
я не понимаю как фунционирует HTTP 1.1
так правильнее | для erros:
то же самое, что и видео, которое сохраняется в буфере, и после выключения компа продолжает играть. | выключения инета в смысле | точные каталоги сохранения не знаю, но думаю твой вопрос работает по томуже принципу |
1|2К списку тем
|