Понедельников НЕТ!
Регистрация или вход Регистрация или вход Избранное на этом сайте | Главная | Анкета | Рекомендовать | Обратная связь | В избранное | Сделать домашней
Скачать SSDForums
Скачать SSDForums 1.0.1 Скачать SSDForums 1.0.1
Скачать SSDForums 1.0.1 SP1 Скачать SSDForums 1.0.1 SP1
Скачать SSDForums 1.0.1 SP2 Скачать SSDForums 1.0.1 SP2
SSD Forums 1.0.1 SP3 only Slaed 3.5 Pro SSD Forums 1.0.1 SP3 only Slaed 3.5 Pro
SSD Forums 1.0.1 SP4-beta only Slaed 4.1 Pro SSD Forums 1.0.1 SP4-beta only Slaed 4.1 Pro
Jewelry Сase Team
Скачать Ruby Chat 0.1.1 Скачать Ruby Chat 0.1.1
Меню
Главная
Форум
Магазин цифровых товаров

Новости
Подписка на новости
Темы новостей
Добавить новость

Каталог файлов
Карта файлового архива
Публикации

Опросы
Анкета пользователя
Чат

BestMaker
Викторина
Архив новостей
Карманный оракул
Поиск по сайту с помощью Яндекс
Поиск по сайту с помощью Google
Фото дня
Для души
Погода на 3 дня
IndexCat
IndexTop
Map_Pages
Поиск по сайту









Подписка на новости
Ваше имя:
Ваш E-Mail:*
Секретный код:
Секретный код
Повторить:*
Интересное в сети

Sape — это система купли-продажи ссылок
с главных и внутренних страниц сайтов
Форум -> Вагон для курящих -> Скрипт отдачи файла пользователю. Вопрос
Скрипт отдачи файла пользователю. Вопрос
otherside Дата: 28.03.2013, в 10:17 | Сообщение №1
otherside
Старожил
Пользователь №: 22
Сообщений: 387

Делаю раздел с архивными номерами журнала в PDF. Встал вопрос отдачи файла пользователю. Были задачи: не показывать истинное расположение файла, сделать ссылку временной и только для одного ip.

В инете наткнулся вот на этот ресурс. Супер, то что было нужно. В итоге все получилось - пользователю формируется ссылка, которая живет сутки и действует только с его IP.

Но вот проблема, pdf файлов многои весят они по 60-80 мегабайт. Наши одмины поставили мне отдельную железку с апачем, куда я складирую все pdf файлы. А в описании к выше озвученному скрипту сказано: "причем файл может располагаться вообще на другом сервере".

В итоге, в самом скрипте я прописываю путь с директории вот так:
Код
1
$fsize=filesize('http://192.168.0.1/uploads/pdf_archive/'.$fname);
$fdown='http://192.168.0.1/uploads/pdf_archive/'.$fname;


И вот тут встает проблема, файл то начинает скачиваться, но скорость просто никакая - 1-2 кб\с.

моих знаний не хватает, чтобы понять как решить задачу с удаленным расположением файлов. Прошу помогите, можно и как то решить эту пробелму. Спасибо.


А вот код самого файла, который отдает пользователю файл:
Код
1
<?
//$fname=$_GET['fname'];

$hash_file = $_GET['hash_file'];
$folder = $_GET['folder'];
$id = $_GET['id'];
$ip = "".$_SERVER['REMOTE_ADDR']."";
$ip_crypt = md5($ip);

$date_today = date("m.d.y");
$crypto_date = md5($date_today);
$fname = base64_decode($hash_file);
$fsize=filesize('http://192.168.0.1/uploads/pdf_archive/'.$fname);
$fdown='http://192.168.0.1/uploads/pdf_archive/'.$fname;


if ($crypto_date == "".$folder."" AND $id == "".$ip_crypt."" ) {


// Установлена или нет переменная 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, 700000);
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, 700000);
sleep(1);
}
fclose($f);
}

} else {

echo "что то не так";
}
?>


_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Отредактированно otherside 28.03.2013 г. в 10:18:12
Sunvas Дата: 06.04.2013, в 02:00 | Сообщение №2
Sunvas
Профи
Пользователь №: 181
Сообщений: 552

Цитата
sleep(1);

Был бы мой сервер - оторвал бы кое-что.

Цитата
echo fread($f, 700000);

Если вы думаете, что эта строка вот так сразу отдает браузеру ~700 кб текста, то ошибаетесь.

Если файлы удаленные - юзайте сокеты, и быстрее и головняка меньше.

Вы не можете ответить в тему анонимно, пожалуйста, войдите или зарегистрируйтесь!


Реклама
Главная | Форум | Новости | Подписка на новости | Темы новостей | Добавить новость | Каталог файлов | Карта файлового архива | Публикации | Опросы | Анкета пользователя | Чат | BestMaker | Викторина | Архив новостей | Карманный оракул | Поиск по сайту с помощью Яндекс | Поиск по сайту с помощью Google | Фото дня | Для души | Погода на 3 дня | IndexCat | IndexTop | Map_Pages | Весь Оракул

Rambler's Top100

Генерация страницы: 0.277 сек. и 16 запросов к базе данных за 0.029 сек.
Web site engine code is Copyright © 2006 by SLAED CMS. All rights reserved.