Chcę wymagać pobrania pliku, gdy użytkownik odwiedza stronę internetową z PHP. Myślę, że ma to coś wspólnego file_get_contents
, ale nie jestem pewien, jak to wykonać.
$url = "http://example.com/go.exe";
Po pobraniu pliku z header(location)
nim nie następuje przekierowanie na inną stronę. Po prostu się zatrzymuje.
Odpowiedzi:
Przeczytaj dokumentację o wbudowanej funkcji PHP readfile
Upewnij się również, że dodajesz odpowiedni typ zawartości w oparciu o plik application / zip, application / pdf itp. - ale tylko wtedy, gdy nie chcesz uruchamiać okna dialogowego Zapisz jako.
źródło
Lub, jeśli pliku nie można otworzyć w przeglądarce, możesz po prostu użyć
Location
nagłówka:źródło
$file
(która zawiera część http), ale poprawną nazwą pliku.jest poprawne
lub lepiej dla plików typu exe
źródło
Wyświetl najpierw swój plik i ustaw jego wartość na adres URL.
index.php
download.php
źródło
W przypadku, gdy musisz pobrać plik o rozmiarze większym niż dozwolony limit pamięci (
memory_limit
ustawienie ini), co spowodowałobyPHP Fatal error: Allowed memory size of 5242880 bytes exhausted
błąd, możesz to zrobić:źródło
ob_flush()
tego, może wystąpić błąd: ob_flush (): nie udało się opróżnić bufora. Brak bufora do opróżnienia . wrap around it withif (ob_get_level() > 0) {ob_flush();}
(Reference stackoverflow.com/a/9182133/128761 )Modyfikacja zaakceptowanej odpowiedzi powyżej, która również wykrywa typ MIME w czasie wykonywania:
źródło
Poniższy kod jest prawidłowym sposobem implementacji usługi pobierania w php, jak wyjaśniono w poniższym samouczku
źródło
file_name
ifilePath
. Niezbyt dobra praktyka kodowania. Zwłaszcza bez wyjaśnienia. Łączenie z zewnętrznym samouczkiem nie jest pomocne.Spróbuj tego:
źródło
http://php.net/manual/en/function.readfile.php
To wszystko, czego potrzebujesz. „Monkey.gif” zmień na nazwę swojego pliku. Jeśli musisz pobrać z innego serwera, „monkey.gif” zmień na „ http://www.exsample.com/go.exe ”
źródło
Możesz także przesyłać strumieniowo pobieranie, które zużywa znacznie mniej zasobów. przykład:
W powyższym przykładzie pobieram plik test.zip (w rzeczywistości był to plik zip ze studia Android na moim komputerze lokalnym). php: // wyjście jest strumieniem tylko do zapisu (zwykle używane przez echo lub print). po tym wystarczy ustawić wymagane nagłówki i wywołać stream_copy_to_stream (źródło, miejsce docelowe). Metoda stream_copy_to_stream () działa jak potok, który pobiera dane wejściowe ze strumienia źródłowego (strumień odczytu) i kieruje je do strumienia docelowego (strumień zapisu), a także pozwala uniknąć problemu wyczerpania dozwolonej pamięci, dzięki czemu można faktycznie pobrać pliki, które są większe niż twój PHP
memory_limit
.źródło
Odpowiedzi przede mną działają. Ale chciałbym wnieść wkład w metodę, jak wykonać to za pomocą GET
na twojej stronie html / php
i
download.php
zawierapowinno to działać na wszystkich typach plików. nie jest to testowane przy użyciu POST, ale może działać.
źródło