Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobieranie plików z bazy MySql
Forum PHP.pl > Forum > PHP
nabuchodonozor_plt
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. ?>
Kicok
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. ?>
mike
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.
nabuchodonozor_plt
Wielkie dzięki !
Rozwiązanie mike_mech działa bez zarzutu.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.