Сваляне на файл чрез php

webdeveloper

Registered
В момента използвам следното за да се свалят файлове от url адрес:

PHP:
header("Pragma: public");
    header("Expires: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: private",false);
    header("Content-Type: audio/mpeg"); 
    header("Content-Disposition: attachment; filename=\"$ime.mp3\";"); 
    header("Content-Transfer-Encoding: binary");
    ob_clean(); 
    flush(); 
    readfile( $url_na_faila );

Днес обаче като си проследявах трафика към сървъра ми направи впечатление, че при сваляне на файл го отнася и моят сървър въпреки, че самият файл не е хостнат от мен. Явно кода по-горе първо сваля файла на машината и след това го дава на потребителя, което не е добър вариант от към оптимизация. Бих ползвал директно връзката, но проблема е, че ми трябва да се променя името на файла преди той да бъде свален.

Примерно имам:

saita.com/listen.mp3

Както казах бих го дал на потребителя директно така за да си го свали, но не искам да го свали с името listen.mp3. Други варианти има ли?
 
Ако не искаш да се сваля с оригиналното име това е единствения начин, който аз се сещам, но трафика минава през теб. Ако не искаш трафика да минава през теб просто пренасочи потребителя към файла на другия сървър примерно с:

header('Location: '.$url_na_faila);
 
webdeveloper каза:
В момента използвам следното за да се свалят файлове от url адрес:

PHP:
header("Pragma: public");
    header("Expires: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: private",false);
    header("Content-Type: audio/mpeg"); 
    header("Content-Disposition: attachment; filename="$ime.mp3";"); 
    header("Content-Transfer-Encoding: binary");
    ob_clean(); 
    flush(); 
    readfile( $url_na_faila );

Днес обаче като си проследявах трафика към сървъра ми направи впечатление, че при сваляне на файл го отнася и моят сървър въпреки, че самият файл не е хостнат от мен. Явно кода по-горе първо сваля файла на машината и след това го дава на потребителя, което не е добър вариант от към оптимизация. Бих ползвал директно връзката, но проблема е, че ми трябва да се променя името на файла преди той да бъде свален.

Примерно имам:

saita.com/listen.mp3

Както казах бих го дал на потребителя директно така за да си го свали, но не искам да го свали с името listen.mp3. Други варианти има ли?
PHP:
$name = htmlspecialchars(addslashes($_GET['name']));
$razmer = htmlspecialchars(addslashes($_GET['pixels']));
$select = mysql_query("SELECT * FROM wallpapers WHERE odobren='da' AND name='$name'");
$sel = mysql_fetch_assoc($select);
header("Pragma: public");
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: private", false);
header("Content-Type: image/jpg"); 
if($razmer == NULL) {
$no = '';
}
else {
$no = '_';
}
header("Content-Disposition: attachment; filename="wallpapers/" . $sel['name']."$no$razmer.jpg";");
header("Content-Transfer-Encoding: binary"); 
header("Content-Description: File Transfer"); 
ob_clean(); 
flush(); 
readfile($wall['link']);
Виж този код си го пооправи, няма грешка :)
 
webdeveloper каза:
Styl3rbg чел си през ред...

Не може да няма друг начин... :cry:

Помисли малко....

Ако искаш да направиш каквато и да е промяна на данните, които даваш на потребителя трябва първо да ги изтеглиш, след това да ги модифицираш и след това да ги дадеш на потребителя. Това води до преминаване на трафика през теб.
Ако искаш да не минава трафика през теб не можеш да промениш каквото и да е освен ако админа на другия сайт не ти направи специален скрипт, на който ти да подаваш параметри, които той да обработва преди да върне съдържанието и тогава трябва да пренасочиш потребителя като добавиш параметрите в query string-a към въпросния скрипт.
 
Добре върти ми се друг вариант в главата, но за него ще ми трябва друго.
Има ли начин да взема изходният код с CURL например на даден сайт, но не целият, а само част от него за да не товари сървъра?

Смисъл да не взима целият изходен код и след това с explode да си взема каквото ми е нужно, а директно да търси само тази част от кода която ми трябва и ако я има да ми я подаде.
 
Не съм чел другите мнения. Но чрез фукцията readfile ти четеш файла и няма как да не го отнесеш. :) Това е като fopen. :?:
 
Ev0luti0N каза:
Не съм чел другите мнения. Но чрез фукцията readfile ти четеш файла и няма как да не го отнесеш. :) Това е като fopen. :?:

А варианта с функцията copy (копиране в някоя временна папка, след това подаване на потребителя и след неговото изтегляне изтриване на файла от сървъра не е ли по оптимален?
 
webdeveloper каза:
Ev0luti0N каза:
Не съм чел другите мнения. Но чрез фукцията readfile ти четеш файла и няма как да не го отнесеш. :) Това е като fopen. :?:

А варианта с функцията copy (копиране в някоя временна папка, след това подаване на потребителя и след неговото изтегляне изтриване на файла от сървъра не е ли по оптимален?
Ми пробвай, но нали знаеш, че времето за copy() пак не е малко. Тоест copy както казваш сваля файла на твоят сървър това пак е някакъв трафик. Но пробвай, нищо няма да загубиш. :?:
 

Back
Горе