Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Tworzenie tymczasowego pliku i jego pobranie, Potrzebuje utworzyć plik tymczasowy i ściągnąć go na dysk lokalny
zaajcu
post
Post #1





Grupa: Zarejestrowani
Postów: 206
Pomógł: 3
Dołączył: 18.08.2011
Skąd: Chrzanów

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


Cześć.

Nie mogę sobie poradzić z stworzeniem pliku tymczasowego a potem umożliwić użytkownikowi jego pobranie.
Chodzi mi o coś takiego ,że gdy user kliknie w link to mu się dynamicznie utworzony pliki pobierze.

Dodam jeszcze bo pewnie ma to znaczenie że wszystko na stronie leci ajax'em, więc po kliknięciu w link leci post coś zwróci a użytkownikowi pojawi się okienko do pobrania pliku (takie jak przy normalnym pobieraniu)
Go to the top of the page
+Quote Post
Sephirus
post
Post #2





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Temat jest ciekawy. Jeżeli wysyłasz ajax request, który tworzy plik po czym zwraca do niego link - wyświetlając go gdzieś na stronie to pojawi się też kwestia "kiedy usunąc ten plik".

Moja propozycja:

Zmień rozumowanie - twoja koncepcja zawiera dwa punkty:
1. ajax - generacja pliku i utworzenie do niego linku
2. link - pobranie pliku

Co z kasowaniem?

Moja koncepcja 2 kroki:
1. ajax - sprawdzanie wszystkiego dotyczącego tego czy user może pobrać żądany plik, następnie zapis w sesji że może i który, utworzenie linku.
2. link - user klika, następuje generacja pliku w locie, przesłanie go użytkownikowi z PHP (brak potrzeby usuwania)

wink.gif


--------------------
If you're good at something, never do it for free.
Potrzebujesz skryptu JS lub PHP - szukasz kogoś kto przetestuje twoją aplikację pod względem bezpieczeństwa? Szybko i solidnie? Napisz ;)
Mój blog - Jak zwiększyć wydajność front-endu - O buforowaniu wyjścia w PHP słów kilka...
Go to the top of the page
+Quote Post
Crozin
post
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Nie możesz po prostu wysłać odpowiednich nagłówków (wymuszających "normalne" pobranie) oraz wyświetlić z poziomu PHP tych danych?
Go to the top of the page
+Quote Post
zaajcu
post
Post #4





Grupa: Zarejestrowani
Postów: 206
Pomógł: 3
Dołączył: 18.08.2011
Skąd: Chrzanów

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


Cytat(Sephirus @ 19.12.2011, 10:22:03 ) *
Moja koncepcja 2 kroki:
1. ajax - sprawdzanie wszystkiego dotyczącego tego czy user może pobrać żądany plik, następnie zapis w sesji że może i który, utworzenie linku.
2. link - user klika, następuje generacja pliku w locie, przesłanie go użytkownikowi z PHP (brak potrzeby usuwania)




sprawdzanie czy user może pobrać mam bo jak nie będzie miał uprawnień do danego modułu to klasa go nie puści dalej. Nie wiem jak utworzyć ten plik w locie tak żeby się nie zapisał na dysku.

i nie wiem do końca jak zrobić z tym linkiem mam przycisk export xml i po kliknięciu na niege. leci post do handlera tam jest ladowana odpowiednia klasa i uruchamiana funkcja i z tej funkcji chciałbym wypluc plik i uruchumoic jego pobranie

Ten post edytował zaajcu 19.12.2011, 10:32:13
Go to the top of the page
+Quote Post
Uriziel01
post
Post #5





Grupa: Zarejestrowani
Postów: 307
Pomógł: 37
Dołączył: 9.11.2010
Skąd: Zielona Góra

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


Ale z czego tworzysz ten plik ? To jest jakies generowane archiwum czy tez z bazy danych ? Poprostu zwracasz link do pliku który wyrzuca odpowiedni nagłówek i treść pliku. Możesz to zrobić nawet przez token jeżeli generowania tego pliku nie da się zautomatyzować i zapisywac w bazie dane opisujące ten token. Generujesz token i podpinasz pod niego odpowiednią zawartośc pliku, potem dajesz mu linke do np. pobierz.php?TOKEN_ID=123456789, tam skypt zwraca odpowiednie naglówki i treść. Po wszystkim usuwasz ten token z bazy (Jeżeli mają to być linki jednorazowe)

Ten post edytował Uriziel01 19.12.2011, 10:45:54
Go to the top of the page
+Quote Post
lukaskolista
post
Post #6





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


Pobieranie plikow przez uzytkownikow to tak na prawde nie pobieranie plikow. Wykorzystuje sie do tego konkretne naglowki HTTP, dzieki ktorym przegladarka mysli ze otrzymala plik i rozpoczyna jego pobieranie. Zeby wyslac cokolwiec jako plik wcale nie musisz tworzyc tymczasowych plikow, wrecz bylo by to porazka.
Go to the top of the page
+Quote Post
zaajcu
post
Post #7





Grupa: Zarejestrowani
Postów: 206
Pomógł: 3
Dołączył: 18.08.2011
Skąd: Chrzanów

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


Dane do pliku są pobierane z bazy danych. Generowanie będzie w pełni automatyczne zależne od jednej zmiennej.
Chciałem to zrobić bez otwierania nowego okna.
ale z tego co mówicie można by faktycznie zrobić normalny link do pliku download.php gdzie zostanie stworzony ten plik i jakieś tam nagłówki dodane. wink.gif

Teraz tylko pytanie jakie nagłówki i jak stworzyć zawartość pliku? Wystarczy normalne echo i zmiana nagłówka? i jak zmienić nazwę pliku?
Go to the top of the page
+Quote Post
Uriziel01
post
Post #8





Grupa: Zarejestrowani
Postów: 307
Pomógł: 37
Dołączył: 9.11.2010
Skąd: Zielona Góra

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


Przykład z jakiejś strony z google wink.gif
Musisz tylko podpiąć swoją zawartość do $filecontent i nazwe pliku do $downloadfile;
No i oczywiście 'Content-Type' musi odpowiadac faktycznemu plikowi.
(Od razu mówię że nie wiem czy ten skrypt zawiera jakies błedy, to nie mój kod)
  1. <?php
  2. $filecontent="Some text/code im creating in the script";
  3. $downloadfile="somefile.txt";
  4.  
  5. header("Content-disposition: attachment; filename=$downloadfile");
  6. header("Content-Type: application/force-download");
  7. header("Content-Transfer-Encoding: binary");
  8. header("Content-Length: ".strlen($filecontent));
  9. header("Pragma: no-cache");
  10. header("Expires: 0");
  11.  
  12. ?>


Ten post edytował Uriziel01 19.12.2011, 10:54:09
Go to the top of the page
+Quote Post
zaajcu
post
Post #9





Grupa: Zarejestrowani
Postów: 206
Pomógł: 3
Dołączył: 18.08.2011
Skąd: Chrzanów

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


Dzięki za chwile się za to wezmę wink.gif

Cytat(Uriziel01 @ 19.12.2011, 10:51:01 ) *
Przykład z jakiejś strony z google wink.gif
Musisz tylko podpiąć swoją zawartość do $filecontent i nazwe pliku do $downloadfile;
No i oczywiście 'Content-Type' musi odpowiadac faktycznemu plikowi.
(Od razu mówię że nie wiem czy ten skrypt zawiera jakies błedy, to nie mój kod)
  1. <?php
  2. $filecontent="Some text/code im creating in the script";
  3. $downloadfile="somefile.txt";
  4.  
  5. header("Content-disposition: attachment; filename=$downloadfile");
  6. header("Content-Type: application/force-download");
  7. header("Content-Transfer-Encoding: binary");
  8. header("Content-Length: ".strlen($filecontent));
  9. header("Pragma: no-cache");
  10. header("Expires: 0");
  11.  
  12. ?>


wszystko prawie fajnie tylko potrzebuje zeby do pliku mi zapisało taką treść:

  1.  
  2. <model nart="40020710" typ="TD-160/100 N SILENT" bieg="HS" uv="230" no="2500" pw="25" pwmin="" ia="0.16" qm="180" ps="105" tmin="-20" tmax="40" mk="1.4" fi="100" fio="97" dba="24" reg="REB-1" name="" />


a z tym jest mały problem bo nie wyświetle tego na stronie ze względu na <> jak je pozamieniam na &lt; &gt; to niestety ale te znaczniki tam lądują :/

jak można to obejść

zrobiłem tak:

  1. $file = "modele.$g->typ";
  2. $file = fopen($file, 'w+');
  3. fwrite($file, $filecontent,strlen($filecontent));
  4. fclose($file);
  5.  
  6. header("Location: modele.xml");


utworzyłem sobie jeden plik który będzie zawsze pobierany i zrobiłem hedera na niego ale niestety zamiast mi się on pobrać to mi się on wyświetla w przeglądarce :/
nie wiem jaki nagłówek dorzucić żeby się pobrał chyba że macie inny pomysł na to.
Go to the top of the page
+Quote Post
adbacz
post
Post #10





Grupa: Zarejestrowani
Postów: 532
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

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


Z tego co wiem, to musisz dać przeglądarce do zrozumienia, że to plik pobieralny header("Content-Type: application/force-download");, i nie dawać żadnego jego typu MIME. W tedy przeglądarka uzna, że nie otworzy tego pliku, więc da userowi mozliwość pobrania pliku. Ja u siebie mam cos takiego i działa, bez względu na to jaki to plik:

  1. $name = basename($path);
  2.  
  3. $size = filesize($path);
  4.  
  5. header( 'Pragma: public' );
  6. header( 'Pragma: no-cache' );
  7. header( 'Expires: 0' );
  8. header( 'Cache-Control: must-revalidate, post-check=0, pre-check=0' );
  9. header( 'Cache-Control: public ');
  10. header( 'Content-Description: File Transfer' );
  11.  
  12. header( 'Content-Type: application/force-download' );
  13.  
  14. header( 'Content-Disposition: attachment; filename=\"'.$name.'\"' );
  15. header( 'Content-Disposition: attachment; filename='.$name );
  16.  
  17. header( 'Content-Transfer-Encoding: binary' );
  18. header( 'Content-Length: '.$size );
  19.  
  20. readfile($path);
Go to the top of the page
+Quote Post
adrian512
post
Post #11





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 30.06.2014

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


Odkopię troszkę temat.

Pomoże ktoś jak wysłać dwa pliki?
Go to the top of the page
+Quote Post
Pyton_000
post
Post #12





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Nie da się wysłać 2 plików.
Musisz spakować na serwerze i wysłać spakowany.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 21.08.2025 - 18:00