Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] jak zrobić możliwość ściągniecia pliku przez usera
Forum PHP.pl > Forum > PHP
lamcpp
witam, chcialbym uzyskać efekt podobny do strony:
Kod
http://php.skryptoteka.pl/scripts.php?cat=2&how_many=20&page=1

a mianowicie żeby użytkownik mógł pobrać interesujący go plik i po nacisnieciu na "pobierz" by plik zapisywał sie u niego na dysku. Za pomocą jakich funkcji w php można to osiągnąć? ewentualnie jakieś inne rozwiązania javascript?
darko
  1. $do = @$_REQUEST["do"];
  2. $fileid = @$_REQUEST["fileid"];
  3.  
  4. switch($do) {
  5. case "download":
  6. switch($fileid) {
  7. case 1:
  8. // np. dla pliku test.pdf:
  9. $filename = "test.pdf";
  10. header("Content-type: application/pdf");
  11. header("Content-Disposition: attachment; filename=$filename");
  12. readfile($filename);
  13. break;
  14. }
  15. break;
  16.  
  17. default:
  18. echo("<a href=\"header.php?do=download&fileid=1\">pobierz</a>");
  19. break;
  20. }
lamcpp
dzięki skrypt działa,
a jak zrobić do tego skryptu panel admina?
próbuje, próbuje i nic mi nie wychodzi;/
jmail
otworzyć notatnik NetBeans Eclipse PSPad czy czego tam używasz i napisać ^^

to nei dział gotowce. Poza tym mógłbyś napisać czym chcesz tam zarządzać, jakie funkcjonalności chcesz mieć itp.
lamcpp
chciałbym zrobić panel admina dla funkcjonalności działu: "downloadu plików". Czyli by można było dodawać z panelu admina nowe programy m wraz z opisem i możliwością pobrania by na stronie wyświetlało się tak tak:

Kod
PSPAD EDITOR
--------------------
PSPad jest rozbudowanym i konfigurowalnym edytorem napisanym przez czeskiego programistę Jana Fialę. Projekt powstał, żeby ułatwić prace twórcom zmuszonym do korzystania z wielu różnych środowisk programistycznych. Przy pomocy jednego darmowego narzędzia mogą oni edytować wiele rodzajów plików, korzystając z podświetlania składni oraz dużych możliwości konfiguracyjnych.

Pobierz          Zgłoś błąd



Kod
NOTEPAD++ 5.5.
-------------------
Notepad++ jest bardzo dobrym, darmowym edytorem kodów źródłowych. Projekt bazuje na potężnym komponencie edytora tekstu - Scintilla. Aplikacja jest napisana w C++, czystym Win32 Api i STL dzięki czemu działa wydajniej a wielkość pliku jest bardzo mała.

Pobierz         Zgłoś błąd


itd.


Chciałbym ponadto by nazwa programu, opis i nazwa pliku, który będzie pobierany były zapisywane w bazie danych.

A więc najpierw tworzę tabelę w bazie danych o nazwie skrypty:

  1. CREATE TABLE `skrypt` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `nazwa_pliku` varchar(30) NOT NULL,
  4. `opis` text NOT NULL,
  5. `nazwa_s` varchar(35) NOT NULL,
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=MyISAM AUTO_INCREMENT=18 DEFAULT CHARSET=latin2


następnie chce pobrać te wartości od użytkownika aby zapisać je w bazie danych

  1. <form action="" method="post">
  2. Nazwa programu:<input type="text" name="nazwa_s" maxlength="35" /><br />
  3. Opis:<textarea rows="10" cols="30" name="opis" /></textarea><br />
  4. Nazwa pliku<input type="text" name="nazwa_pliku" maxlength="30"/>
  5. <input type="hidden" name="submitted" value="TRUE" />
  6. <input type="submit" name="submit" value="Zapisz" />
  7. </form>


Sprawdzam czy wszystkie pola zostały wprowadzone, a jeśli nie ma błedów to podane 3 wartości zapisuje w bazie danych:

  1. <?php
  2. if(isset($_POST['submitted']))
  3. {
  4. require_once('dane.php'); //dołączam plik z połączeniem do bazy danych
  5. $errors = array();
  6. if(empty($_POST['nazwa_s']))
  7. {
  8. $errors[] = 'Nie podałeś nazwy programu';
  9. }
  10. else
  11. {
  12. $nazwa_s = mysqli_real_escape_string($dbc,trim($_POST['nazwa_s']));
  13. }
  14.  
  15. if(empty($_POST['opis']))
  16. {
  17. $errors[] = 'Nie podałeś opisu';
  18. }
  19. else
  20. {
  21. $opis = mysqli_real_escape_string($dbc,trim($_POST['opis']));
  22. }
  23.  
  24. if(empty($_POST['nazwa_pliku']))
  25. {
  26. $errors[] = 'Nie podałeś nazwy pliku';
  27. }
  28. else
  29. {
  30. $nazwa_pliku = mysqli_real_escape_string($dbc,trim($_POST['nazwa_pliku']));
  31. }
  32.  
  33. if(empty($errors))
  34. {
  35. $query = "INSERT INTO skrypt(nazwa_s,nazwa_pliku,opis) VALUES('$nazwa_s','$nazwa_pliku','$opis')";
  36. $wynik = mysqli_query($dbc,$query);
  37. if($wynik)
  38. {
  39. echo 'dodano do bazy';
  40. }
  41. else
  42. {
  43. echo 'wystapiły nieoczekiwane błedy';
  44. }
  45. }
  46. else
  47. {
  48. foreach($errors as $msg)
  49. {
  50. echo "błąd - $msg<br />";
  51. }
  52. }
  53. }
  54. ?>



calosc wyglada tak:

nazwa pliku: dodaj_program.php

  1. <?php
  2. if(isset($_POST['submitted']))
  3. {
  4. require_once('dane.php'); //dołączam plik z połączeniem do bazy danych
  5. $errors = array();
  6. if(empty($_POST['nazwa_s']))
  7. {
  8. $errors[] = 'Nie podałeś nazwy programu';
  9. }
  10. else
  11. {
  12. $nazwa_s = mysqli_real_escape_string($dbc,trim($_POST['nazwa_s']));
  13. }
  14.  
  15. if(empty($_POST['opis']))
  16. {
  17. $errors[] = 'Nie podałeś opisu';
  18. }
  19. else
  20. {
  21. $opis = mysqli_real_escape_string($dbc,trim($_POST['opis']));
  22. }
  23.  
  24. if(empty($_POST['nazwa_pliku']))
  25. {
  26. $errors[] = 'Nie podałeś nazwy pliku';
  27. }
  28. else
  29. {
  30. $nazwa_pliku = mysqli_real_escape_string($dbc,trim($_POST['nazwa_pliku']));
  31. }
  32.  
  33. if(empty($errors))
  34. {
  35. $query = "INSERT INTO skrypt(nazwa_s,nazwa_pliku,opis) VALUES('$nazwa_s','$nazwa_pliku','$opis')";
  36. $wynik = mysqli_query($dbc,$query);
  37. if($wynik)
  38. {
  39. echo 'dodano do bazy';
  40. }
  41. else
  42. {
  43. echo 'wystapiły nieoczekiwane błedy';
  44. }
  45. }
  46. else
  47. {
  48. foreach($errors as $msg)
  49. {
  50. echo "błąd - $msg<br />";
  51. }
  52. }
  53. }
  54. ?>
  55. <form action="" method="post">
  56. Nazwa programu:<input type="text" name="nazwa_s" maxlength="35" /><br />
  57. Opis:<textarea rows="10" cols="30" name="opis" /></textarea><br />
  58. Nazwa pliku<input type="text" name="nazwa_pliku" maxlength="30" />
  59. <input type="hidden" name="submitted" value="TRUE" />
  60. <input type="submit" name="submit" value="Zapisz" />
  61. </form>


Dane zapisują się w bazie danych, ale: nazwa pliku wolałbym by była wczytywana za pomocą okna z dysku użytkownika i zapisywana do bazy. W tej chwili trzeba ją wpisywać z rozszerzeniem ale to uciązliwe. Jak zrobić takie okno?
Teraz tworzę strone wyświetl_dzial_download, która wyświetli wszystkie programy jakie mam w bazie, dając użytkownikowi możliwość pobrania ich na dysk

Tak zakodowałem strone
wyswietl_dzial_download.php:

  1. <?php
  2. require_once('../dane.php'); //dołączam połączenie z bazą
  3. $query = "SELECT * FROM skrypt";
  4. $result = mysqli_query($dbc,$query);
  5. if($result)
  6. {
  7. while($wynik = mysqli_fetch_array($result,MYSQL_ASSOC))
  8. {
  9. echo "<b>{$wynik['nazwa_s']}</b><br />{$wynik['opis']}<br />";
  10. echo("<a href=\"/poznajnet/skrypty/wyswietl_skrypt.php?do=download&fileid={$wynik['id']}\">pobierz</a>");
  11. $do = @$_REQUEST["do"];
  12. $fileid = @$_REQUEST["fileid"];
  13. if($fileid = $wynik['id'] && $do = 'download')
  14. {
  15. header("Content-type: application/zip");
  16. header("Content-Disposition: attachment; filename={$wynik['nazwa_pliku']}");
  17. readfile($wynik['nazwa_pliku']);
  18. }
  19. }
  20. }
  21. else
  22. {
  23. echo 'Nie udało się wyświetlić danych';
  24. }
  25. ?>


Jednak nie działa ona prawidłowo, owszem wypisane zostają nazwa programu i opis, ale nie działa link "pobierz",dzięki któremu użytkownik będzie mógł pobrać program na dysk. Dodatkowo wyświetlają się dwa ostrzeżenia: "header alredy sent...." rozumiem że nagłówki powinny być na samej górze przed instrukcjami echo ale nie bardzo wiem jak zmodyfikować ten kod.
Wydaje mi się tez ze instrukcja if($fileid = $wynik['id'] && $do = 'download') jest niewłaściwa, jaki warunek tam wstawić by plik był pobierany tylko po naciśnięciu linka?


PO przetestowaniu tego w przeglądarce tak to wygląda:
Cytat
avast
PSPad jest rozbudowanym i konfigurowalnym edytorem napisanym przez czeskiego programist? Jana Fial?. Projekt powsta?, ?eby u?atwi? prace twórcom zmuszonym do korzystania z wielu ró?nych ?rodowisk programistycznych. Przy pomocy jednego darmowego narz?dzia mog? oni edytowa? wiele rodzajów plików, korzystaj?c z pod?wietlania sk?adni oraz du?ych mo?liwo?ci konfiguracyjnych.
pobierz
Warning: Cannot modify header information - headers already sent by (output started at D:\usr\poznajnet\skrypty\wyswietl_skrypt.php:9) in D:\usr\poznajnet\skrypty\wyswietl_skrypt.php on line 15

Warning: Cannot modify header information - headers already sent by (output started at D:\usr\poznajnet\skrypty\wyswietl_skrypt.php:9) in D:\usr\poznajnet\skrypty\wyswietl_skrypt.php on line 16
PK����Ľ�~/ţé ę��K�����2_23.phpĽTËnŰ0źČ?lŁ ň°�6'yiZä� uŇCa�"Sś�H*�ţ÷î��,ÇN[ A\îÎg�,�L¸ÖŹSĆ3ö�?eŚŰ$yŹ5\�ĹÉ�Ă <Ä : -žd � �ć˛ŕQ*edŁA˘HH0*ÎňLĚ@#Ŕ�EĄŤLł��¸ŕT�Š6VfS\îűU"�R! ĽqŽyżŐąˇá:Vźŕ�+ Ú`ZSa�ĄÍjáş��LSř¤ˇ�EçĎ��ĎmQĂ�eźwqrŻ ę�%�=$ŇJ$&�˘�54'5Ď]Ď�FU´&|Ąę�Őë�yŚ÷�§Łş˘Y luŻ)˛jR�Ä|ĹMĽD-Í:ČT� žź2YÁN°�[ĘšäÜě:é�n�]�qSůŚëĄYps6¸¸ž�\}ž<B�'Ä� ˝*^Ä÷ë*6ř]<ÂĘťůü�´ĄzJ� �ľŃěU]H*Ó¨,fZŇ dÉĹë<<�˛ÇŇŮ/: Ĺéw ŻŃ%U<�"őr×áN�äRs�QˇÖ\�ŞýÓeěůéâuLćŇ�ŁB#Ôtąć�ĆŠesŁi:�MD�çtŢ�w\ÓťżÖĚ�xä%ô��\x�O7ĘLco\��?�ćÎe��'l˝;WJŞáĺa×^Éq*ßá˝7ßÝü­w-ąÚ�nîEËnz§\ńY6QźĚă�ł`8ěé˙zăńyđCŠ5=[EďŮÉ�˛2+||Cę×j7#3ŚFž�ôŚž� #oˇi�U:}T�áŢ��ě�O+�Ďóý+űó�él°ţ˙{ÚŰ�Ćąbe|+žúFŹŃř��Ű�{+\sţTćrĘ�ÓŠČ%EâXi�`�Ę Ú�áţ�Žü���qCŐîď8�b°89�ßPK ����Ľ�~/ţé ę��K���������� �������2_23.phpPK������6�������



Prosiłbym o pomoc.
phpion
Wywal oba wywołania echo.
lamcpp
rzeczywiście wywalenie echo pomoże,
jednak te echo jest mi potrzebne, aby wyświetlić dane z bazy danych,
jak jeszcze zmienić tą instrukcję if aby dopiero po kliknięciu na linka zapisywała załącznik na dysk, bo teraz jest tak że robi to od razu
phpion
Zrób to na zasadzie:
Kod
Jeżeli chce ściągnąć plik {
    pobierz plik;
} w przeciwnym wypadku {
    wyświetl listę plików;
}
lamcpp
ok przeksztalciłem trochę kod, korzystając z porad z Waszej wikipedii dodałem ob_start() i ob_end_flush() zeby nie występowały warningi, choć nie wiem czy to dobra praktyka,
zmieniłem instrukcje if, która teraz sprawdza czy link został kliknięty i wszystko chodzi jak należy:) no może poza tym żę dalej nie wiem jak w panelu admina zrobić funkcjonalność by pliki można było dodawać z dysku i zapisywać je w bazie danych ale i tak jest dobrze, dzięki za pomoc i oświecenie, tu kod tego co wymodziłem:

  1. <?php
  2. require_once('../dane.php'); //dołączam połączenie z bazą
  3. $query = "SELECT * FROM skrypt";
  4. $result = mysqli_query($dbc,$query);
  5. if($result)
  6. {
  7. while($wynik = mysqli_fetch_array($result,MYSQL_ASSOC))
  8. {
  9. echo "<b>{$wynik['nazwa_s']}</b><br />{$wynik['opis']}<br />";
  10. echo "<a href=\"/poznajnet/skrypty/wyswietl_skrypt.php?do=download&fileid={$wynik['id']}\">pobierz</a>";
  11. $do = @$_REQUEST["do"];
  12. $fileid = @$_REQUEST["fileid"];
  13. $wynik = $wynik['nazwa_pliku'];
  14. if($_GET['do'] == 'download')
  15. {
  16. header("Content-type: application/zip");
  17. header("Content-Disposition: attachment; filename=$wynik");
  18. readfile($wynik);
  19. }
  20. }
  21. }
  22. else
  23. {
  24. echo 'Nie udało się wyświetlić danych';
  25. }
  26. ?>
  27.  
  28.  
phpion
Cytat(lamcpp @ 15.10.2009, 10:58:44 ) *
ok przeksztalciłem trochę kod, korzystając z porad z Waszej wikipedii dodałem ob_start() i ob_end_flush() zeby nie występowały warningi, choć nie wiem czy to dobra praktyka,

Nie jest to dobra praktyka. Jest to omijanie/maskowanie błędów zamiast ich wyeliminowanie.
lamcpp
no tak, ale w tym przypadku nie bardzo mogę usunąć instrukcje echo,
tak myślałem żeby przenieść je poniżej headerów, ale nie bardzo się da to zrobić ponieważ z zawartośći echo (a dokładniej danych zawartych w odnośniku) korzysta później instrukcja if, która znajduje się przed headerami.
phpion
Rozwiązania są 2:
1. Podczas próby ściągania pliku pobierasz tylko rekord dla danego pliku, a w liście plików listujesz wszystkie pliki.
2. Zamiast echować od razu zapisujesz dane do tablicy, a wyświetlasz je później.
Rozwiązanie 1 jest bardziej PRO, ale 2 zrobisz szybciej.
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.