Перейти к содержимому

Реферальная программа Мегаплана

Выбрать шаблон и создать сайт

Скачивание файла на той же странице

#11 BaCo

BaCo
  • Пользователь
  • 103 сообщений
  • Репутация: 0
0

Отправлено 12 Май 2010 - 19:26

Вот пример:
1) С ограничением скорости скачивания:
<?php
$fname=$_GET['fname'];
$fsize=filesize('secret_data/'.$fname);

// Шлем заголовки
Header("HTTP/1.1 200 OK");
Header("Connection: close");
Header("Content-Type: application/octet-stream");
Header("Accept-Ranges: bytes");
Header("Content-Disposition: Attachment; filename=".$fname);
Header("Content-Length: ".$fsize);

// Открыть файл для чтения и отдавать его частями
$f=fopen('secret_data/'.$fname,'r');
while (!feof($f)) {
// Если соединение оборвано, то остановить скрипт
if (connection_aborted()) {
fclose($f);
break;
}
echo fread($f,10000);
// Пазуа в 1 секунду. Скорость отдачи 10000 байт/сек
sleep(1);
}
fclose($f);
?>

2) С докачкой:
<?php
$fname=$_GET['fname'];
$fsize=filesize('secret_data/'.$fname);
$fdown='secret_data/'.$fname;

// Установлена или нет переменная HTTP_RANGE
if (@getenv('HTTP_RANGE')=="") {
// Читать и отдавать файл от самого начала
$f=fopen($fdown, 'r');

header("HTTP/1.1 200 OK");
header("Connection: close");
header("Content-Type: application/octet-stream");
header("Accept-Ranges: bytes");
header("Content-Disposition: Attachment; filename=".$fname);
header("Content-Length: ".$fsize);

while (!feof($f)) {
if (connection_aborted()) {
fclose($f);
break;
}
echo fread($f, 10000);
sleep(1);
}
fclose($f);
}
else {
// Получить значение переменной HTTP_RANGE
preg_match ("/bytes=(\d+)-/", getenv('HTTP_RANGE'), $m);
$csize=$fsize-$m[1]; // Размер фрагмента
$p1=$fsize-$csize; // Позиция, с которой начинать чтение файла
$p2=$fsize-1; // Конец фрагмента

// Установить позицию чтения в файле
$f=fopen($fdown, 'r');
fseek ($f, $p1);

header("HTTP/1.1 206 Partial Content");
header("Connection: close");
header("Content-Type: application/octet-stream");
header("Accept-Ranges: bytes");
header("Content-Disposition: Attachment; filename=".$fname);
header("Content-Range: bytes ".$p1."-".$p2."/".$fsize);
header("Content-Length: ".$csize);

while (!feof($f)) {
if (connection_aborted()) {
fclose($f);
break;
}
echo fread($f, 10000);
sleep(1);
}
fclose($f);
}
?>

  • 0

#12 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 12 Май 2010 - 22:45

Спасибо за отличные скрипты. =) Но это, опять же, не то. =)
  • 0

#13 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 18 Май 2010 - 21:17

gaaarfild, я глянул мной написанные скрипты выдачи файлов на скачку, если ничего кроме содержимого файла не отдавать, то при клике на ссылку будет предложено скачать файл, но по ссылке на страницу браузер не переходит. Так что не пому в чем у тебя была проблема, почему у тебя открывалось новое окно, ты наверное сам сделал открытие ссылки в новом окне.
  • 0

#14 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 19 Май 2010 - 11:06

Ну естественно сам, иначе скачивание файла начинается, но страница заменяется на пустую.
  • 0

#15 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 19 Май 2010 - 21:32

gaaarfild, у меня пустой ничего не заменяется. Файл выдаётся, но браузер остаётся на той же странице, что и был. Какой браузер?
  • 0

#16 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 20 Май 2010 - 12:31

АперА.
  • 0

#17 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 20 Май 2010 - 18:25

gaaarfild, у меня файл выдачи такой:
<?php

$path = "csv_dump"; // имя папки дампа с CSV

$down_file = ereg("^[A-Za-z0-9\.]+$", $_GET['file']) ? $_GET['file'] : ""; // проверяем имя файла на загрузку.
if( $down_file != "" && file_exists($path . "/" . $down_file) ) // Если нормальнгый путь и не пустой + существует файл
{
$down_size = filesize($path . "/" . $down_file); // подсчитываем размер
header('Content-Length: ' . $down_size); // передаем заголовок размера данных
header('Content-Disposition: attachment; filename=' . $down_file); // передаем заголовок, что собираемся отдать файл с именем
header('Content-type: application/x-force-download; name="' . $down_file . '"'); // файл отдается наз закачку
readfile($path . "/" . $down_file); // выводим файл
}


header('location: index.php'); // перенаправление произойдет только если браузер не отдаст файл на скачку
exit(); // завершаем старый процесс.

?>


Всё работает как часы, файл скачивается как по заказу и перенаправления не происходит.
  • 0

#18 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 21 Май 2010 - 12:59

Я так понимаю, если файл отдастся на скачку, данный код прервется??? Я просто не вижу тут никакой причины коду не дойти до редиректа. =)
  • 0

#19 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 21 Май 2010 - 13:04

gaaarfild,

Я просто не вижу тут никакой причины коду не дойти до редиректа. =)

Заголовки! Если браузеру сообщается, что документ идёт на скачку, он даже на страницу не переходит, он просто забирает документ, а уж куда редиректница процесс, это его не волнует...
  • 0

#20 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 21 Май 2010 - 14:00

хм. понятно. =) Спасибо попробую.
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru