Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [AJAX][PHP] jak Ajaxem po przesłaniu danych zapisać plik na dysk użytkownika?
jhoihkjhkhnkh
post 23.08.2017, 11:21:25
Post #1





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 14.07.2017

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


Teraz robię taką głupawkę, że po naciśnięciu przycisku najpierw idzie Ajax gdzie na podstawie parametrów tworzę plik na serwerze, a potem idzie normalny request gdzie w odpowiedzi zapisuję plik na dysku usera. Wolałbym to robić tylko ajaxem.

teraz jest tak:

  1.  
  2.  
  3. if (//wchodzi ajax){
  4. //wygeneruj plik i zapisz nazwę w sesji
  5. }
  6.  
  7. if(//wchodzi zwykły request){
  8. //odbierz z sesji nazwę pliku i ...
  9. header('Content-Description: File Transfer');
  10. header("Content-type: text/csv; charset=utf-8");
  11. header('Content-Disposition: attachment; filename=' . basename($exportedFile));
  12. header('Content-Transfer-Encoding: binary');
  13. header('Expires: 0');
  14. header('Cache-Control: must-revalidate');
  15. header('Pragma: public');
  16. header('Content-Length: ' . filesize($exportedFile));
  17. flush();
  18. readfile($exportedFile);
  19. unlink($exportedFile);
  20. }
  21.  



i wcześniej ajax

  1. <a href="?action=exp" id="export">
  2. </a>
  3. <script type="text/javascript">
  4. $("#export").click(function () {
  5. $.ajax({
  6. url: "../admin/shop.php",
  7. data: {
  8. action: 'exp',
  9. tableParams: tableParams
  10. }
  11. })
  12. });



Problem polega na tym, że zdarza się że szybszy jest request "zwykły" a potem idzie ajax. Mogłoby tak zostać ale musiałbym jakoś zmusić by najpierw szedł ajax a po nim zwykły request. Muszę to robić ajaxem bo dane na podstawie którym mam wygenerować plik są widoczne tylko przez javascript

Ten post edytował jhoihkjhkhnkh 23.08.2017, 11:57:18
Go to the top of the page
+Quote Post
nospor
post 23.08.2017, 11:53:57
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Jak sobie wyobrazasz, ze skrypt php bedacy na serwerze zapisze sam z siebie plik na komputerze uzytkownika? Magic?

Cytat
Problem polega na tym, że zdarza się że szybszy jest request "zwykły" a potem idzie ajax. Mogłoby tak zostać ale musiałbym jakoś zmusić by najpierw szedł ajax a po nim zwykły request.
No to wysylaj zwykly request dopiero gdy AJAX sie skonczy. Masz przeciez zdarzenie onsuccess dla AJAXow i wiesz kiedy sie skonczyly


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
jhoihkjhkhnkh
post 23.08.2017, 12:42:14
Post #3





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 14.07.2017

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


Cytat(nospor @ 23.08.2017, 12:53:57 ) *
No to wysylaj zwykly request dopiero gdy AJAX sie skonczy. Masz przeciez zdarzenie onsuccess dla AJAXow i wiesz kiedy sie skonczyly

zrobiłem tak:

  1. $("#export").click(function () {
  2. $.ajax({
  3. url: "../admin/shop.php",
  4. data: {
  5. action: 'exp',
  6. tableParams: tableParams
  7. },
  8. success: function() {
  9. $.get( "//export()" );
  10. }
  11. })
  12. });


przy debugowaniu widzę jak za drugim razem wpada w ten fragment kodu (który wcześniej skutecznie zapisywał plik na dysk usera) gdzie ustawiany jest header (i w trakcie debugowania widzę że ten plik istnieje na serwerze)
  1. header('Content-Description: File Transfer');
  2. header("Content-type: text/csv; charset=utf-8");
  3. header('Content-Disposition: attachment; filename=' . basename($exportedFile));
  4. header('Content-Transfer-Encoding: binary');
  5. header('Expires: 0');
  6. header('Cache-Control: must-revalidate');
  7. header('Pragma: public');
  8. header('Content-Length: ' . filesize($exportedFile));
  9. flush();
  10. readfile($exportedFile);
  11. unlink($exportedFile);

ale finalnie nie zapisuje żadnego pliku na dysk usera.

Ten post edytował jhoihkjhkhnkh 23.08.2017, 13:00:05
Go to the top of the page
+Quote Post
nospor
post 23.08.2017, 13:09:54
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Toz mowiles, ze drugi to jest zwykly request a teraz w kodzie widze ze drugi to jest tez ajax i na dodatek jakis dziwny :/
$.get( "//export()" );


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
jhoihkjhkhnkh
post 23.08.2017, 13:30:14
Post #5





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 14.07.2017

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


Mówiłeś bym on success wysłał zwykły request, tom dodał ten $.get( "//export()" );

Aha, drugi request "zwykły" w sensie tu oba requesty są związane z tym samym przyciskiem (<a><button>) i to samo naciśnięcie wywołuje ajax a potem zwykły request bo w ajaxie nie wyłączam zachowania tego przycisku.

Ten post edytował jhoihkjhkhnkh 23.08.2017, 13:38:06
Go to the top of the page
+Quote Post
nospor
post 23.08.2017, 13:42:49
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




No to wylacz zachowanie tego przycisku.
Drugi zwykly request (nie AJAX) masz zrobic dopiero gdy pierwszy (AJAX) sie zakonczy


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
jhoihkjhkhnkh
post 23.08.2017, 13:48:29
Post #7





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 14.07.2017

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


nie rozumiem

wysyłam drugi request gdy pierwszy się skończył (success)
A jak wysłać zwykły request bez kolejnego klikania w bloku success?

Ten post edytował jhoihkjhkhnkh 23.08.2017, 13:56:17
Go to the top of the page
+Quote Post
Pyton_000
post 23.08.2017, 14:11:04
Post #8





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

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


window.location.replace('?action=export');
Go to the top of the page
+Quote Post
jhoihkjhkhnkh
post 23.08.2017, 14:17:24
Post #9





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 14.07.2017

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


też nie zapisuje pliku
  1. $("#export").click(function () {
  2. $.ajax({
  3. url: "../admin/shop-products.php",
  4. data: {
  5. action: 'exp',
  6. tableParams: tableParams
  7. }
  8. }).success(function(){
  9. window.location.replace('?action=export');})
  10. });
Go to the top of the page
+Quote Post
nospor
post 23.08.2017, 14:37:35
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@Pyton uzyl za duzego skrotu myslowego...

document.location.href='?action=exp';


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
jhoihkjhkhnkh
post 23.08.2017, 15:49:43
Post #11





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 14.07.2017

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


allah akhbar, działa!
Go to the top of the page
+Quote Post
jhoihkjhkhnkh
post 23.08.2017, 16:20:08
Post #12





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 14.07.2017

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


(edit: działa)

jasna cholera, lokalnie działa, ale na serwerze już nie.

już wkleję całość by nie było wątpliwości

  1. function export()
  2. {
  3. $tableParams = $_GET['tableParams'] questionmark.gif false;
  4. if (!$session->get('csvFile') and !$tableParams){
  5. showList();
  6. }
  7.  
  8. if (!$session->get('csvFile') and $tableParams){
  9. // $session->set('csvFile')
  10. }
  11.  
  12. if($session->get('csvFile')) {
  13. $exportedFile = $session->get('csvFile');
  14. unset($_SESSION['csvFile']);
  15. //zapis pliku na dysk lokalny usera, wg https://stackoverflow.com/a/11316004/6827096
  16. header('Content-Description: File Transfer');
  17. header("Content-type: text/csv; charset=utf-8");
  18. header('Content-Disposition: attachment; filename=' . basename($exportedFile));
  19. header('Content-Transfer-Encoding: binary');
  20. header('Expires: 0');
  21. header('Cache-Control: must-revalidate');
  22. header('Pragma: public');
  23. header('Content-Length: ' . filesize($exportedFile));
  24. flush();
  25. readfile($exportedFile);
  26. unlink($exportedFile);
  27. }
  28. }


  1. <a href="" id="export">
  2. <button >
  3. </button>
  4. </a>
  5. <script type="text/javascript">
  6. $("#export").click(function () {
  7. $.ajax({
  8. url: "//export()",
  9. data: {
  10. action: 'exp',
  11. tableParams: tableParams
  12. }
  13. }).success(function(){
  14. document.location.href='?action=exp';
  15. })
  16. });
  17. </script>




edit:

zmieniłem
<a href="" id="export"><button ></button></a>

na
<p id="export"></p>

i chwilowo działa.

Ten post edytował jhoihkjhkhnkh 23.08.2017, 16:25:47
Go to the top of the page
+Quote Post
Pyton_000
post 23.08.2017, 16:46:19
Post #13





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

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


$("#export").click(function (e) {
e.preventDefault();
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 Wersja Lo-Fi Aktualny czas: 14.08.2025 - 10:04