logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak pobrać pliki z MySQL LONGBLOB za pomocą PHP?

czarekp 06 Wrz 2007 14:23 3449 9
REKLAMA
  • #1 4256108
    czarekp
    Poziom 12  
    Posty: 105
    Pomógł: 5
    Ocena: 1
    Witam
    Wrzucam sobie do bazy danych pliki, do pola longblob, za pomocą formularza php. Chce aby można było zrobić download tego pliku. Nie wiem jak, pomocy
  • REKLAMA
  • #2 4256194
    krzychoocpp
    VIP Zasłużony dla elektroda
    Posty: 1866
    Pomógł: 387
    Ocena: 58
    Witam, po co trzymać pliki w bazie danych ? Nie lepiej zapisać sobie w niej tylko adres pliku ? Jest to możliwe, ale najpierw niech kolega napisze dlaczego wybrał akurat takie rozwiązanie.

    Poza tym MSQL z tego co wiem nie obsługuje LONGBLOB - może chodziło o MySQL ? Jeśli tak proszę poprawić post.

    Pozdrawiam, Krzysztof.
  • #3 4256396
    czarekp
    Poziom 12  
    Posty: 105
    Pomógł: 5
    Ocena: 1
    MySQL :) Zielony jestem z baz danych, ale to mi się wydało praktyczne. Nie trzeba się martwić że plik o jakiejś nazwie już istnieje i nie zostanie nadpisany.
    Jest trochę tak że biorę się za coś z czego jestem zielony. Przydadzą się wszystkie rady. Pomysł z trzymaniem tylko adresów nie jest zły.
  • REKLAMA
  • Pomocny post
    #4 4256530
    krzychoocpp
    VIP Zasłużony dla elektroda
    Posty: 1866
    Pomógł: 387
    Ocena: 58
    czarekp napisał:
    Nie trzeba się martwić że plik o jakiejś nazwie już istnieje i nie zostanie nadpisany

    W PHP bardzo prosto można to zrobić, sprawdzając czy plik o podanej nazwie już istnieje. Jeśli tak, dodajemy do nazwy losowy numer i powtarzamy aż do uzyskania wolnej nazwy, w bazie danych można zapisać odnośnik i informacje o pliku.

    Używanie bazy danych do przechowywania plików znacząco obniża wydajność, czasami przydaje się przechować jakieś małe pliki tekstowe, ale przechowywanie plików które mają być w domyśle pobierane nie ma większego sensu.

    Pozdrawiam, Krzysztof.
  • #5 4256587
    czarekp
    Poziom 12  
    Posty: 105
    Pomógł: 5
    Ocena: 1
    W takim razie przyznaję racje.
    Mam zatem prośbę. Czy mógłby mi kolega wskazać jakieś dobre skrypty, które mógłbym przeanalizować i przerobić na własne potrzeby. Chodzi o upload i download plików i przypisanie pikowi właściciela, który po zalogowaniu mógłby zarządzać plikami, tzn.. dodawać i usuwać. Zainspirował mnie artykuł: http://www.codeguru.pl/article-145.aspx Chciałem to zrobić na linuxie:) Wiem że google jest pełen takich artykułów, ale naprawdę sporo przegooglowałem i za wiele to mi to nie dało.

    Pozdrawiam
  • REKLAMA
  • #6 4256727
    krzychoocpp
    VIP Zasłużony dla elektroda
    Posty: 1866
    Pomógł: 387
    Ocena: 58
    Zobowiązuję kolegę do poprawienia błędów w poprzednim poście (Pierwszy też warto poprawić, zdanie zaczynamy wielką literą, kończymy kropką).

    Potrzebne będzie połączenie kilku skryptów. Najważniejsze to logowanie i upload plików. Każdy użytkownik może mieć swój katalog, wypisanie z niego plików bedzie już proste. Artykułów na ten temat jest wiele, ale prościej znaleźć te opisujące prostsze czynności.

    Co do logowania:
    http://4programmers.net/PHP/Prosty_skrypt_logowania - tu zamiast plików można użyć bazy danych.

    Pozdrawiam, Krzysztof.
  • #7 4306785
    czarekp
    Poziom 12  
    Posty: 105
    Pomógł: 5
    Ocena: 1
    Udało mi się zrobić tak jak kolega polecał, czyli w BD przechowuje jedynie adres do pliku. Mam teraz problem z usuwaniem jednocześnie rekordu z BD i samego pliku. Co powinienem dopisać by działało tak jak chce.

    
    <?php
    //łączenie się z bazą danych
    mysql_connect ("localhost", "root", "pecyncez") or
     die ("nie można połączyć z MYSQL");
    mysql_select_db ("upload") or
     die ("nie można połączyć z cwphp");
    
    
    if ($_GET['co'] == 'skasuj') {
    $query  = "DELETE FROM pliki WHERE id_pliku = '".$_GET['id']."';";
    $zapytanie = mysql_query($query) or
    die ("Błąd w pytaniu");
    
    }
    
    //wybieranie pól z tabeli pliki
    $query = "SELECT * FROM pliki;"; 
    $zapytanie = mysql_query($query) or
    die ("Błąd w pytaniu");
    
    //rysowanie nagłówka tabeli 
    print ('<table cellpadding="5" border="0" width="100%"><tr><td width="25%"><b><font color="#000099" size="3">Nazwa pliku:</font></b></td><td width="10%"><b><font color="#000099" size="3">Właściciel</font></b></td><td width="15%"><b><font color="#000099" size="3">Data</font></b></td><td width="50%"><b><font color="#000099" size="3">Opis pliku</b></font></td></tr>');
    
    //skcja wpisyania wartości rekordów do tabeli
    
    
    while ($rekord = mysql_fetch_assoc ($zapytanie)) {
    $id_pliku = $rekord['id_pliku'];
    $nazwa_pliku = $rekord['nazwa_pliku'];
    $wlasciciel_pliku = $rekord['wlasciciel_pliku'];
    $data_pliku = $rekord['data_pliku'];
    $opis_pliku = $rekord['opis_pliku'];
    
    
    print ('<tr><td><font color="#000099" size="2"><a href="/upload/'.$nazwa_pliku.'"><font color="#000099" size="2">'.$nazwa_pliku.'</font></a></td><td width=10%><font color="#000099" size="2">'.$wlasciciel_pliku.'</font></td><td width=15%><font color="#000099" size="2">'.$data_pliku.'</font></td><td width=50%><font color="#000099" size="2">'.$opis_pliku.'</font></td><td width=50%><font color="#000099" size="2"><a href="usuwanie.php?co=skasuj&id='.$id_pliku.'\"><font color="red" size="4">USUŃ</font></a></td>
    </tr>');
    }
    print ("</table>");
    ?>
    


    Przypominam, że ja się dopiero uczę i że wiem co to google

    Pozdrawiam
  • REKLAMA
  • #8 4306892
    krzychoocpp
    VIP Zasłużony dla elektroda
    Posty: 1866
    Pomógł: 387
    Ocena: 58
    Przed usunięciem informacji o pliku z bazy danych, wykonaj zapytanie które zwróci ścieżkę do pliku - potem możesz usunąć i plik i rekord w bazie.

    Pozdrawiam, Krzysztof.
  • Pomocny post
    #9 4328536
    shg
    Poziom 35  
    Posty: 2289
    Pomógł: 339
    Ocena: 134
    Dwie i pół uwagi.
    <?php
    //łączenie się z bazą danych
    mysql_connect ("localhost", "root", "*****") or
     die ("nie można połączyć z MYSQL");

    Nie powinieneś dobierać się do bazy danych jako root, utwórz użytkownika o minimalnych uprawnieniach wystarczających do normalnej obsługi bazy (polecenia CREATE USER i GRANT). Rozumiem, że narazie to faza testów, ale na przyszłość tak. No i to hasło w kodzie..., tu "wygwiazdkowałem", ale ciekawe gdzie jeszcze takiego używasz? :P

    $query  = "DELETE FROM pliki WHERE id_pliku = '".$_GET['id']."';";

    Nie powinieneś wklejać "nieobrobionego" fragmentu URI ($_GET['id']) do zapytania, chyba że dobrze wiesz co robisz. Użyj funkcji mysql_real_escape_string(), czy czegoś w tym rodzaju.
    http://pl2.php.net/manual/pl/function.mysql-real-escape-string.php

    krzychoocpp napisał:
    Przed usunięciem informacji o pliku z bazy danych, wykonaj zapytanie które zwróci ścieżkę do pliku - potem możesz usunąć i plik i rekord w bazie.

    Najpierw usunąć rekord z bazy, a potem plik, chociaż i to nie było by do końca bezpieczne. Chodzi o sytuację, gdy równolegle do kasowania wystąpi inne zapytanie o ten plik i zostanie zwrócona ścieżka do już nieistniejącego pliku. Zazwyczaj oczywiście nie ma to większego znaczenia i nic groźnego nie powinno się stać.
  • #10 4331753
    czarekp
    Poziom 12  
    Posty: 105
    Pomógł: 5
    Ocena: 1
    To są moje początki i popełniam błędy. Gdy wracam do starszych kodów to się czasami za głowę łapie. Dzięki takim odpowiedzią jest łatwiej zacząć.


    Dziękuje i pozdrawiam

Podsumowanie tematu

✨ Dyskusja dotyczy pobierania plików zapisanych w bazie danych MySQL w polu typu LONGBLOB za pomocą PHP. Zwrócono uwagę, że przechowywanie plików bezpośrednio w bazie danych obniża wydajność i często lepszym rozwiązaniem jest zapisywanie w bazie jedynie ścieżek do plików na serwerze. Zaproponowano mechanizm generowania unikalnych nazw plików przy uploadzie, aby uniknąć nadpisywania. Omówiono również kwestie związane z implementacją funkcji usuwania plików wraz z odpowiadającymi im rekordami w bazie, podkreślając konieczność najpierw pobrania ścieżki pliku z bazy, a następnie usunięcia pliku z systemu plików i rekordu z bazy. Zwrócono uwagę na bezpieczeństwo, m.in. unikanie używania konta root do łączenia się z bazą oraz zabezpieczenie zapytań SQL przed wstrzyknięciami poprzez odpowiednie filtrowanie danych wejściowych. Podano linki do przykładów prostych skryptów logowania i zarządzania plikami w PHP, które można dostosować do własnych potrzeb. Autor przyznał, że jest początkujący i docenił udzielone wskazówki.
Wygenerowane przez model językowy.
REKLAMA