Skrypt download.php nie działa. Proszę o pomoc.

0

Witam.
Mam skrypt
download_file.php, który powoduję pobranie pliku z serwera po jego ID

Nie wiem dlaczego mi nie działa.
Jak nie ma pliku w $dir = "files/$id_user/"; to wyświetla komunkat, że nie ma.
Jak jest to jest puste okno przeglądarki i nic.
Co może być nie tak? Może potrzeba jakiś ustawień .htaccess ?? albo ustawienia na serwerze. Sam nie wiem.
Proszę o pomoc.

<?php session_start();
include ('config.php');                 // plik z konfiguracją strony 
include('core.php');                    // plik z funkcjami

$id = check_input($_GET['idf']);

$sql = mysql_query("SELECT * FROM `gu_files` WHERE `id_file` = '$id'");
while ($rek = mysql_fetch_array($sql)) {
    $id_file = $rek['id_file'];
    $id_user = $rek['id_user'];
    $nazwa_pliku = $rek['nazwa_pliku'];
    $rozszerzenie = $rek['rozszerzenie'];
    $hash = $rek['hash'];
    $size = round($rek['size'] / 1024,1) . ' KB';
}

if ($_SESSION['id'] == $id_user) {

    $filename = $hash . '.' . $rozszerzenie;
    $dir = "files/$id_user/";

    if(ini_get('zlib.output_compression')){ ini_set('zlib.output_compression', 'Off'); }

    $file_extension = strtolower(substr(strrchr($filename,"."),1));

    if( $filename == ""){
        echo "<html><title>Document Downloads</title><body>Error: No such file to download.</body></html>";
        exit;
    } elseif (!file_exists($dir.$filename)){
        echo "<html><title>Document Downloads</title><body>Error: File ".$dir.$filename." Not Found</body></html>";
        exit;
    }

    switch( $file_extension ){
        case "pdf": $ctype="application/pdf"; break;
        case "exe": $ctype="application/octet-stream"; break;
        case "zip": $ctype="application/zip"; break;
        case "doc": $ctype="application/msword"; break;
        case "docx": $ctype="application/msword"; break;
        case "xls": $ctype="application/vnd.ms-excel"; break;
        case "xlsx": $ctype="application/vnd.ms-excel"; break;
        case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
        case "gif": $ctype="image/gif"; break;
        case "png": $ctype="image/png"; break;
        case "jpeg":
        case "jpg": $ctype="image/jpg"; break;
        default: $ctype="application/force-download";
    }
    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: ".$ctype);
    header("Content-Disposition: attachment; filename=\"".basename($nazwa_pliku.".".$rozszerzenie)."\";" );
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: ".filesize($dir.$filename));
    //readfile($dir.$filename);
    header("X-Sendfile: $dir$filename");

    exit();
}
else {
    echo "<html><title>Document Downloads</title><body>Error: File ".$dir.$filename." is Not Your!</body></html>";
}
?>
0

Masz na serwerze obsługę nagłówka X-Sendfile? W przypadku Apache będzie to mod_xsendfile.

0
Rev napisał(a):

Masz na serwerze obsługę nagłówka X-Sendfile? W przypadku Apache będzie to mod_xsendfile.

Mam konto na hostingu. Tam mogę chyba dodawać.
Jak powinno to wyglądać aby dodać X-sendfile i gdzie.

Mam Hosting na WebiQ

0

Odkomenduj readfile(), a zakomentuj linijkę pod nim, bo nie skorzystasz na tym hostingu z mechanizmu sendfile raczej.

0
Demonical Monk napisał(a):

Odkomenduj readfile(), a zakomentuj linijkę pod nim, bo nie skorzystasz na tym hostingu z mechanizmu sendfile raczej.

Ok zrobiłem i teraz pobiera, ale zamiast np plik .zip mam na oknie przeglądarki "krzaki" albo jpg to samo, a powinno zip pokazać gdzie zapisać a jpg otworzyć.
Co może być jeszcze?

0
header("Content-Disposition: attachment; filename=\"".basename($nazwa_pliku.".".$rozszerzenie)."\";" );

zamień na:

header('Content-Disposition: attachment; filename="' . basename($nazwa_pliku . '.' . $rozszerzenie) . '"');

Jedyne co tam może przeszkadzać to średnik na samym końcu nagłówka raczej.

0
Demonical Monk napisał(a):
header("Content-Disposition: attachment; filename=\"".basename($nazwa_pliku.".".$rozszerzenie)."\";" );

zamień na:

header('Content-Disposition: attachment; filename="' . basename($nazwa_pliku . '.' . $rozszerzenie) . '"');

Jedyne co tam może przeszkadzać to średnik na samym końcu nagłówka raczej.

zamieniłem i to samo.

Na pewno dobrze pozamieniałeś znaki " na ' ?

Nawet jak całkowicie usunąłem tą linijkę to jest to samo hm. W takim razie ona jest niewykorzystywana.

Funkcja readfile chyba traktuję plik jako dane i czyta jak nazwa mówi a nie wysyła hm

0

spróbuj

$aFile='nazwapliku.txt';
header('Content-Disposition: attachment; filename='.$aFile); 

Content-Disposition daje Ci nazwę pliku, więc dla testów wstaw sobie jakąś nazwę i zobacz, czy pod tą nazwą będzie Ci te pliki ściągać
jeśli masz plik 'doc' to daj rozszerzenie 'doc'
zobaczysz, czy nie ma gdzieś błędu w przetwarzaniu nazwy

0
tomasz256 napisał(a):

spróbuj

$aFile='nazwapliku.txt';
header('Content-Disposition: attachment; filename='.$aFile); 

Content-Disposition daje Ci nazwę pliku, więc dla testów wstaw sobie jakąś nazwę i zobacz, czy pod tą nazwą będzie Ci te pliki ściągać
jeśli masz plik 'doc' to daj rozszerzenie 'doc'
zobaczysz, czy nie ma gdzieś błędu w przetwarzaniu nazwy

wstawiłem, ale nic nie dało. Zachowuje się identycznie jak przedtem.

0
grax napisał(a):

wstawiłem, ale nic nie dało. Zachowuje się identycznie jak przedtem.

to może problem jest w pobieraniu nazwy pliku
poniżej Twojego postu dzek69 dał przykład
ewentualnie sprawdź ten tylko przerób pod swoje zapytanie

if(isset($_POST['file_name'])){
$aFile = $_POST['file_name'];
$filepath = 'admin/files/';
$path = $filepath.$aFile;

 header("Content-Type: application/force-download");
                header("Content-Description: File Transfer");
                header('Content-Disposition: attachment; filename='.$aFile);
                header("Content-Transfer-Encoding: binary");
                header('Content-Length: '.filesize($path));
                readfile($path);

}
?> 

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0