• 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.

0 głosów
1,363 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,920 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ź 1,544 wizyt
pytanie zadane 21 grudnia 2020 w C i C++ przez wodzu_37 Nowicjusz (160 p.)
0 głosów
1 odpowiedź 800 wizyt
pytanie zadane 3 grudnia 2020 w C i C++ przez Mateusz1223 Bywalec (2,440 p.)
0 głosów
1 odpowiedź 520 wizyt
pytanie zadane 4 stycznia 2020 w C# przez assassin Gaduła (3,260 p.)

93,776 zapytań

142,736 odpowiedzi

323,388 komentarzy

63,381 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...