• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Porządny download plików na stronie.

Object Storage Arubacloud
0 głosów
713 wizyt
pytanie zadane 3 kwietnia 2016 w PHP przez artimal Gaduła (4,800 p.)
edycja 3 kwietnia 2016 przez artimal
Cześć, gdy wchodzę w ścieżkę do pliku bezpośrednio przez pasek adresu to zamiast pobrać plik, otwiera się on (muzyka). Czy dało by się zrobić taki link po którego kliknięciu nastąpiło by normalne pobieranie pliku? Chciałbym też potem zadbać o sprawy bezpieczeństwa i dostępu do tych plików ale to potem ;)
Pozdrawiajo

4 odpowiedzi

0 głosów
odpowiedź 4 kwietnia 2016 przez artimal Gaduła (4,800 p.)
wybrane 4 kwietnia 2016 przez artimal
 
Najlepsza

Wrzucam aktualny kod. Wypróbowałem wasze propozycje, po drodze "kilka" kolejnych. Efekt jest ciągle ten sam a mi już ręce opadły. Efik, skoro testowałeś u siebie i działa to co zrobiłem źle?

<?php

function killer($e)
{
    echo "<script>alert(".$e.");</script>";
}

if(isset($_GET['hash']))
{
    $hash = $_GET['hash'];
    try
    {
        if (! @include_once('php/connect.php'))
        throw new Exception ('connect.php not exist</br>');
        if (!file_exists('php/connect.php'))
        throw new Exception ('connect.php not exist</br>');
        else
        require_once('php/connect.php');
    }
    catch(Exception $e)
    {    
        killer(0);
    }
    require_once "php/connect.php";

    $polaczenie = new mysqli($host, $db_user, $db_password, $db_name);
    $polaczenie->set_charset("utf8");
    $hash = htmlentities($hash, ENT_QUOTES, "UTF-8");
    $hash = mysqli_real_escape_string($polaczenie, $hash);
    
    if($rezultat = $polaczenie->query(sprintf("SELECT file FROM zamowienia WHERE hash='%s'", $hash)))
    {
        $ile = $rezultat->num_rows;
        if($ile==1)
        {
            $wiersz = $rezultat->fetch_assoc();
            $file = $wiersz['file'];
            killer($file);
            if(!(file_exists($file))) killer(1);
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename='.basename($file));
            header('Expires: 0');
            header('Content-Length: ' . filesize($file));
            $fp = fopen($file, 'rb');
            fpassthru($fp);
        }
        else killer(2);
    }
    else killer(3);
}
?>

 

komentarz 4 kwietnia 2016 przez efiku Szeryf (75,160 p.)
Po prostu, to nie jest Twój kod. ;)

Bo to jest zlepka kilku kodów moim zdaniem ^^

Po co Mysqli? PDO!

Usuń linię 38, bo jest ona niepotrzebna. Po co robisz jakiś śmieszny alert??? (Wysyłasz nagłówek inny, a później inny - właściwy)
komentarz 4 kwietnia 2016 przez efiku Szeryf (75,160 p.)
Pisane z palca, jest kilka opcji które trzeba zabezpieczyć.

https://gist.github.com/efiku/7bbe9923272312e890489be74ec6f88d
komentarz 4 kwietnia 2016 przez artimal Gaduła (4,800 p.)
Czemu niby to nie jest mój kod? Załączanie connect jest ze wzorca który kiedyś mi pomógł na nie czytanie tego pliku :P A od headerów to już Twój kod.
komentarz 4 kwietnia 2016 przez artimal Gaduła (4,800 p.)
Dlaczego PDO a nie mysqli? Przecież z niego korzystam i działa, zwraca dane jakie chcę i sprawdziłem to. Więc z jego strony wszystko działa.
komentarz 4 kwietnia 2016 przez efiku Szeryf (75,160 p.)

Dlatego

code.tutsplus.com/tutorials/pdo-vs-mysqli-which-should-you-use--net-24059

 

Czemu niby to nie jest mój kod? Załączanie connect jest ze wzorca który kiedyś mi pomógł na nie czytanie tego pliku :P

No, to bardzo brzydki wzorzec, nauka starych rzeczy w praktyce ;) 

Czemu niby nie Twój? Bo jak go czytam, mam wrażenie, że nie wiesz co robisz. Mój powinien działać, ale nie ma zabezpieczeń przed:

Brak plik

Rzuceniem wyjątków przez PDO.

Ale ma filtrowanie danych, (prepared statements)

+1 głos
odpowiedź 3 kwietnia 2016 przez DL TD Nałogowiec (36,710 p.)

Przecież to można zrobić z poziomu HTML'a najprościej ;) Robisz to dodając atrybut download do tagu <a>.

Tutaj daję mały przykład:

<a href="http://forum.pasja-informatyki.pl/mz_comm.png" download>Download</a>

0 głosów
odpowiedź 3 kwietnia 2016 przez Boshi VIP (100,240 p.)
<?php
$filename = 'test.doc';//wybieramy plik do ściągnięcia
header('Content-Type:application/force-download');//ustawiamy mu uniwersalny typ mime (można bawić się w nadawanie mu application/msword, image/gif, itd...
header('Content-Disposition: attachment; filename='.basename($filename).';');//tutaj podajemy nazwę pliku - domyślnie ustawiłem, aby plik nazywał się tak jak oryginał
header('Content-Length:'.@filesize($filename));//dodajemy wielkość pliku
@readfile($filename)or die('File not found.');//czytamy plik           
?>

Nie testowane, ale z pewnego forum  opinie były przychylne.  Pewnie działa.
 

1
komentarz 3 kwietnia 2016 przez SyntaxError Pasjonat (17,170 p.)

Matko boska. xd

Lepiej tak:

<?php
$filename = 'test.doc';

if(!is_readable($filename)) {
    header("HTTP/1.1 404 Not Found");
    echo "Not found.";
    exit;
}

header('Content-Type:application/force-download');

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

header('Content-Length:'.filesize($filename));

readfile($filename);
?>

 

komentarz 3 kwietnia 2016 przez Boshi VIP (100,240 p.)
Lepiej lepiej :D
komentarz 3 kwietnia 2016 przez artimal Gaduła (4,800 p.)

Panowie, użyłem już conajmniej 4 wersji kodu czy to od Was, czy dokumentacji, czy z githuba https://gist.github.com/debojitkakoti/9183653/revisions ale efekt zawsze taki:
Czy teraz robią jakoś inaczej muzykę czy o co chodzi?

komentarz 4 kwietnia 2016 przez maly Nałogowiec (37,190 p.)

efik +1 za fpassthru, dzięki temu będzie można w prosty sposób kontynuować pobieranie pliku w przypadku ewentualnego zerwania połączenia co przy dużych/ogromnych plikach ma kluczowe znaczenie.

Należy zwrócić szczególną uwagę na to by do wyjściowego strumienia nie wyrzucać nic poza rządanym plikiem więc wszelkie ostrzeżenia, błędy czy wyjątki powinny być przechwycone/wyciszone.

Zgodnie ze specyfikacją filename w Content-Disposition należy umieszczać pomiędzy ""

Content-Disposition: attachment; filename="blablabla"

@artimal

Jeśli wklejasz bezpośredni do pliku link który nie posiada rozszerzenia wyświetli Ci poprostu jego zawartość.
Powinieneś wywołać skrypt/funkcję z podaną nazwą rządanego pliku, np.

W html

<a href="http://tulub.tam/download.php?file=nazwa_pliku"> Download </a>

W php

$destination_name_ulaw = $_GET['file'];

 

komentarz 4 kwietnia 2016 przez artimal Gaduła (4,800 p.)
Niestety nie działa. W nowym poście wrzuciłem mój cały obecny kod. Może to Wam pomoże w znalezieniu błędu. Wersja php zmieniona na 7 przed chwilą. Jak kod działa możecie zoabczyć o tutej:
http://www.amalamastering.com/8c5661d2aeec5648d3411e3b8eeb96b3
komentarz 4 kwietnia 2016 przez efiku Szeryf (75,160 p.)

To w Twoim skrypcie coś masz namieszane...  Zobacz co dostaję..

komentarz 4 kwietnia 2016 przez maly Nałogowiec (37,190 p.)
To rządanie nie przechodzi przez skrypt który podałeś, gdyby przechodził miałbyś na początku pliku coś takiego :'<script>alert("jakas_nazwa_pliku");</script>".
komentarz 4 kwietnia 2016 przez artimal Gaduła (4,800 p.)
Tam akurat zabrakło ' ' ale to szczegół.
komentarz 4 kwietnia 2016 przez artimal Gaduła (4,800 p.)
Problemem były ECHA które zmieniały typ conentu! Po wywaleniu ich kod Efika działa!
–5 głosów
odpowiedź 3 kwietnia 2016 przez jpacanowski VIP (101,940 p.)
Zapisz jako... ?
komentarz 3 kwietnia 2016 przez DL TD Nałogowiec (36,710 p.)

Czytaj ze zrozumieniem a potem odpowiadaj...

Czy dało by się zrobić taki link po którego kliknięciu nastąpiło by normalne pobieranie pliku?

Podobne pytania

0 głosów
1 odpowiedź 893 wizyt
pytanie zadane 21 grudnia 2020 w C i C++ przez wodzu_37 Nowicjusz (160 p.)
0 głosów
1 odpowiedź 357 wizyt
pytanie zadane 3 grudnia 2020 w C i C++ przez Mateusz1223 Bywalec (2,440 p.)
0 głosów
1 odpowiedź 318 wizyt
pytanie zadane 4 stycznia 2020 w C# przez assassin Gaduła (3,260 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...