|
Форум -> Вагон для курящих -> Скрипт отдачи файла пользователю. Вопрос | Скрипт отдачи файла пользователю. Вопрос |
---|
otherside | Дата: 28.03.2013, в 10:17 | Сообщение №1 | СтарожилПользователь №: 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 | ПрофиПользователь №: 181 Сообщений: 554
|
Был бы мой сервер - оторвал бы кое-что.
Цитата | echo fread($f, 700000); |
Если вы думаете, что эта строка вот так сразу отдает браузеру ~700 кб текста, то ошибаетесь.
Если файлы удаленные - юзайте сокеты, и быстрее и головняка меньше. |
| | | Вы не можете ответить в тему анонимно, пожалуйста, войдите или зарегистрируйтесь!
|
|
|
|