2013-02-04 9 views
5

Używam tego małego pliku php do pobrania pliku "exe", który użytkownik może zapisać, wypełniając formularz.Jak mogę wyświetlić stronę Thankyou po pobraniu pliku użytkownika?

header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename='.basename($file)); 
header('Content-Transfer-Encoding: binary'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate'); 
header('Pragma: public'); 
header('Content-Length: ' . filesize($file)); 
ob_clean(); 
flush(); 
readfile($file); 

z tej metody nie ma link do lokalizacji online $ plików dla kogoś do naśladowania, ale z jakiegoś powodu nie można wyświetlić strony z podziękowaniami po lub nawet bezpośrednio przed wykonaniem kodu.

Próbowałem nagłówek ("Lokalizacja: $ thankyouurl"); bezpośrednio po powyższym kodzie, ale nic nie jest wyświetlane i próbowałem wysłać echo ze źródła html strony z podziękowaniami tuż przed uruchomieniem powyższego kodu, ale to powoduje, że plik exe do pobrania na stronę internetową faktycznie zawiesza przeglądarkę .

Wszelkie sugestie ???

Odpowiedz

14

Skieruj użytkownika bezpośrednio na statyczną stronę z komunikatem z podziękowaniami. Następnie użyj JavaScript, aby ustawić window.location w swoim skrypcie pobierania.

Jeśli nagłówki strony pobierania są poprawnie skonfigurowane, przeglądarka rozpocznie pobieranie pliku, podczas gdy użytkownik czyta wiadomość z podziękowaniami.

Upewnij się, że wyświetla link do bezpośredniego pobierania w przypadku, gdy użytkownik ma wyłączoną obsługę JavaScript.

przykład:

index.php

<a href="thankyou.php">Click here to download.</a> 

thankyou.php

<html> 
<head> 
    <script type="text/javascript"> 
     function startDownload() { 
      window.location = "/download.php"; 
     } 
    </script> 
</head> 
<body onload="startDownload();"> 
    <h1>Thank you!</h1> 
    <p>Your download will start in a moment. If it doesn't, use this <a href="download.php">direct link.</a></p> 
</body> 

download.php

header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename='.basename($file)); 
header('Content-Transfer-Encoding: binary'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate'); 
header('Pragma: public'); 
header('Content-Length: ' . filesize($file)); 
ob_clean(); 
flush(); 
readfile($file); 

Aktualizacja

Aby przekazać dane z index.php do skryptu do pobrania, można użyć GET zmienne. Łącze do strony thankyou.php stanie się thankyou.php?download=12, gdzie pobieranie to identyfikator do pobrania poprawnego pliku. Można by następnie przekazać tę zmienną na skrypcie pobierania przez powtarzając go w znacznikach tak:

index.php

<a href="thankyou.php?download=12">Click here to download.</a> 

thankyou.php

<html> 
<head> 
    <script type="text/javascript"> 
     function startDownload() { 
      window.location = "/download.php?file=<?=$_GET['download']?>"; 
     } 
    </script> 
</head> 
<body onload="startDownload();"> 
    <h1>Thank you!</h1> 
    <p>Your download will start in a moment. If it doesn't, use this <a href="download.php?file=<?=$_GET['download']?>">direct link.</a></p> 
</body> 

ty Następnie pobieramy wartość z twojego skryptu pobierania i traktujemy ją w dowolny sposób.

+0

myślę, że to jest to. Ale teraz w jaki sposób przekazać wartość pliku $ do download.php. W mojej oryginalnej wersji użyłem wysyłania formularzy i wielu wartości, aby utworzyć wartość dla pliku $, a wartości zostały pseudo przekazane przez plik downloadera, który jest "zawarty". Połączyłem twój pomysł z moim poprzez formularz ost wywołujący plik php inicjujący echosię nową wersję strony, którą utworzysz za pomocą skryptu java startownload w nagłówku. Teraz mogę; t zobaczyć, jak przekazać wartość pliku $ z js do pliku php. –

+0

@MarkSowards Sprawdź, czy moja aktualizacja pomaga. – thordarson

+0

Dziękuję za potwierdzenie. Właśnie miałem tego spróbować. –

0

Niezbyt pewny na to, by w ...

header('Location: thanks_page.php'); 

... nie działa ,. jeśli jest umieszczony po pliku readfile()? Nie jestem pewien na pewno, tylko moje myśli!

+0

Zastanawiasz się, że inna opcja może obejmować nagłówek ("Lokalizacja: ...."); przed plikiem readfile(), ponieważ skrypt mógł być uruchamiany nawet po wczytaniu nagłówka strony z podziękowaniami, tylko opcja, nie w 100% pewna, ale warta wypróbowania? Prawdopodobnie przed ob_clean(); również. – Joe

0

Można otworzyć stronę "download" z "windows.open ('url aby pobrać plik')"

Przykład:

<script type="text/javascript"> 
    function openDownload() 
    { 
     window.open("http://domain.com/download.php?file=file.pdf"); 
     window.location = "http://domain.com/thanks.php"; 
    } 
</script> 

Otwieranie okna, które bezpośrednio pobrać plik, to zostanie automatycznie zamknięty po wybraniu zapisu lub anulowania, a następnie okno "nadrzędny" przekieruje do strony z podziękowaniami.

+0

ciekawy pomysł, ale to nie działa. – Sylca

0

Korzystanie z oryginalną metodę, dodać header('location: thank-you-page.php'); do końca, wraz z wyjściem, jak pokazano poniżej:

header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename='.basename($file)); 
header('Content-Transfer-Encoding: binary'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate'); 
header('Pragma: public'); 
header('Content-Length: ' . filesize($file)); 
ob_clean(); 
flush(); 
readfile($file); 

header('location: thank-you-page.php'); 
exit; 
+0

Strona Thankyou jest html i wydaje się, że coś po pliku readfile po prostu się nie dzieje. –

+0

Jeśli chcesz wymusić pobieranie pliku, dlaczego używasz 'readfile'? – adamdehaven

Powiązane problemy