Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Pobieranie plików z bazy MySql
nabuchodonozor_p...
post
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 2.09.2006

Ostrzeżenie: (0%)
-----


Napisałem system upload oparty na bazie MySQL (aby zachować bezpieczeństwo plików).
Skrypt bezbłędnie dodaje do bazy (i pozwala ściągać) wszystkie pliki graficzne, jednak, gdy dodam do bazy plik *.zip, *.rar, *.ace jego ściągnięcie jest niemożliwe.

Baza widzi wszystkie mniej "standardowe" pliki jako typ : application/octet-stream, co powoduje (jak mi się wydaje) nadpisanie złego nagłówka i de facto ściągnięcie pliku tekstowego (choć w rzeczywistości jest to np. .ace) .

Czy możliwy jest download tych "niestandardowych" plików z bazy MySQL ? Dlaczego PHP rozpoznaje typ tych plików zawsze jako "application/octet-stream" ?

Gdzie może być błąd ?


Skrypt UPLOAD :

  1. <?php
  2. $plik_tmp = $_FILES['plik']['tmp_name'];
  3. $plik_nazwa = $_FILES['plik']['name'];
  4. $plik_rozmiar = $_FILES['plik']['size'];
  5.  
  6. $plik_typ = $_FILES['plik']['type'];
  7.  
  8.  
  9. if(is_uploaded_file($plik_tmp)){
  10.  move_uploaded_file($plik_tmp, "upload/$plik_nazwa");
  11. if ($plik_rozmiar>0){
  12. $fileHandle = fopen("upload/$plik_nazwa", "r");
  13. $fileContent = fread($fileHandle, $plik_rozmiar);
  14. $fileContent = addslashes($fileContent);
  15. $z = "insert into files values(NULL, NULL, '".$_POST['uploaded']."','".$_POST['opis']."','".$fileContent."','".$plik_typ."','".$plik_nazwa."',".$plik_rozmiar.",'".$_SESSION['login']."')";
  16. unlink("upload/$plik_nazwa");
  17. }
  18. ?>


Skrypt DOWNLOAD :

  1. <?php
  2. $db = mysql_pconnect('###','###','###');
  3. $z = "select* from files where id=".$_REQUEST['id']." and ( adm='".$_SESSION['login']."' or adm='public' or adm='local')"; // w polu adm jest tylko właściciel pliku
  4. $w = mysql_query($z);
  5. $a = mysql_fetch_array($w);
  6. header("Content-type: ".$a['typ']);
  7.  echo $a['plik'];
  8. ?>
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
Kicok
post
Post #2





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

Ostrzeżenie: (0%)
-----


Sam nagłówek Content-Type nie wystarczy. Użyj:
  1. <?php
  2. header('Content-Type: application/'.$a['typ']);
  3. header('Content-Length: '.$a['rozmiar']);
  4. header('Content-Disposition: attachment; filename="'.$a['nazwa'].'"');
  5. ?>
Go to the top of the page
+Quote Post
mike
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


Cytat(nabuchodonozor_plt @ 11.03.2007, 00:57:12 ) *
Dlaczego PHP rozpoznaje typ tych plików zawsze jako "application/octet-stream" ?
Zacznijmy od tego, że Ty nigdzie nie sprawdzasz tego typu.
Ślepo ufasz przeglądarce a one cząsto kłamią lub się mylą. Inforacja o typie pliku przesyłana w tablicy $_FILES jest czasem tym co się przeglądarce wydaje. A poza tym jest określany na podstawie rozszerzenia.
Jeśli chcesz zapisać do bazy (a potem odczytać) prawdziwy typ pliku skorzystaj z mime_content_type()

Cytat(Kicok @ 11.03.2007, 09:25:37 ) *
Sam nagłówek Content-Type nie wystarczy. Użyj: (...)
To zły przykład.
Powinno być:
  1. <?php
  2.  
  3. // ...
  4. header('Content-type: ' . $content_type);
  5. // ...
  6.  
  7. ?>
a nie:
  1. <?php
  2.  
  3. // ...
  4. header('Content-type: application/' . $content_type);
  5. // ...
  6.  
  7. ?>


No i na koniec: Jaki to ma wszystko związek z bazami danych? Przecież ten wątek powinien być na PHP lub na Przedszkolu.
Go to the top of the page
+Quote Post
nabuchodonozor_p...
post
Post #4





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 2.09.2006

Ostrzeżenie: (0%)
-----


Wielkie dzięki !
Rozwiązanie mike_mech działa bez zarzutu.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 06:44