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



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

#11

Поделиться сообщением #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

Поделиться сообщением #12



gaaarfild

gaaarfild
    Topic Starter
  • Неактивные
  • 596 сообщений
  • Репутация: 0

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

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

#13

Поделиться сообщением #13



ZiTosS

ZiTosS
  • Неактивные
  • 5 148 сообщений
  • Репутация: 8

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

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

#14

Поделиться сообщением #14



gaaarfild

gaaarfild
    Topic Starter
  • Неактивные
  • 596 сообщений
  • Репутация: 0

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

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

#15

Поделиться сообщением #15



ZiTosS

ZiTosS
  • Неактивные
  • 5 148 сообщений
  • Репутация: 8

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

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

#16

Поделиться сообщением #16



gaaarfild

gaaarfild
    Topic Starter
  • Неактивные
  • 596 сообщений
  • Репутация: 0

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

АперА.
  • 0

#17

Поделиться сообщением #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

Поделиться сообщением #18



gaaarfild

gaaarfild
    Topic Starter
  • Неактивные
  • 596 сообщений
  • Репутация: 0

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

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

#19

Поделиться сообщением #19



ZiTosS

ZiTosS
  • Неактивные
  • 5 148 сообщений
  • Репутация: 8

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

gaaarfild,

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

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

#20

Поделиться сообщением #20



gaaarfild

gaaarfild
    Topic Starter
  • Неактивные
  • 596 сообщений
  • Репутация: 0

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

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

robot

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


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