2008-09-03 8 views
40

Jaki kod należy dodać w PHP, aby przeglądarka automatycznie pobierze plik na lokalny komputer po odwiedzeniu łącza?Jak automatycznie uruchomić pobieranie w PHP?

Mam na myśli funkcjonalność podobną do funkcji witryn pobierania, która zachęca użytkownika do zapisania pliku na dysku po kliknięciu na nazwę oprogramowania?

Odpowiedz

48

Wyślij następujące nagłówki przed wyprowadzanie pliku:

header("Content-Disposition: attachment; filename=\"" . basename($File) . "\""); 
header("Content-Type: application/force-download"); 
header("Content-Length: " . filesize($File)); 
header("Connection: close"); 

@grom: Ciekawe o '/ oktet strumienia aplikacji' typu MIME. Nie wiedziałem o tym, zawsze używałem "aplikacji/wymuszania" :)

+0

Nie jestem do końca pewien, dlaczego, ponieważ jest to dla mnie nowość, ale ten skrypt działał poprawnie tylko wtedy, gdy miałem linię długości treści. – sehummel

36

Oto przykład odesłania pliku pdf.

header('Content-type: application/pdf'); 
header('Content-Disposition: attachment; filename="' . basename($filename) . '"'); 
header('Content-Transfer-Encoding: binary'); 
readfile($filename); 

@Swish Nie mogę znaleźć aplikacji/force-download typ zawartości do niczego innego (przetestowane w IE i Firefox). Czy istnieje powód, aby nie odsyłać rzeczywistego typu MIME?

Również w podręczniku PHP Hayley Watson Wysłany:

Jeśli chcesz wymusić plik zostać pobrany i zapisany, zamiast być renderowane, pamiętaj, że nie ma takiego typu MIME jako „application/utwardzana w podwyŜszonej pobieranie". Prawidłowy typ do zastosowania w tej sytuacji to "application/octet-stream", a użycie czegokolwiek innego polega jedynie na tym, że klienci powinni ignorować nierozpoznane typy MIME i zamiast tego używać "application/octet-stream" (odnośnik: sekcje 4.1.4 i 4.5.1 RFC 2046).

Również zgodnie z IANA nie ma zarejestrowanego typu aplikacji/force-download.

+1

Działa na komputerze, ale ... "Nie można pobrać. Treść nieobsługiwana", gdy odwiedzam stronę pobierania na urządzenia z systemem Android. Czemu? – Emerald214

+1

@ Emerald214 Brak czytnika plików PDF. Lub brak powiązania dla typu treści PDF – grom

+0

Szczególnie, jeśli docelowym typem pliku jest .zip i wszystko, co robisz na stronie, uruchamia pobieranie pliku przez PHP, możesz dodać "ob_clean();" '' i '' 'ob_flush();' '' przed kodem podanym w powyższej odpowiedzi; kiedy próbowałem otworzyć .zip natywnie w Windowsie, miałem problem z tym, że system operacyjny .zip-archiwa nabyte w ten sposób były nieprawidłowe, mimo że 7zip i inne dedykowane narzędzia do obsługi skompresowanych archiwów potrafiły sobie z nimi poradzić . – SeldomNeedy

7

Czysty przykład.

<?php 
    header('Content-Type: application/download'); 
    header('Content-Disposition: attachment; filename="example.txt"'); 
    header("Content-Length: " . filesize("example.txt")); 

    $fp = fopen("example.txt", "r"); 
    fpassthru($fp); 
    fclose($fp); 
?> 
+0

Może działać, ale nie posunąłbym się tak daleko, by nazwać to "czystym". Po pierwsze, polega na trzykrotnym wpisaniu nazwy pliku. Zamiast tego ustawiam nazwę pliku jako zmienną, dzięki czemu Twój kod nie będzie redundantny, a zmniejszysz ryzyko błędów. – Mike

0

mój kod działa dla txt, doc, docx, PDF, PPT, PPTX, JPG, PNG, rozszerzeń zip i myślę, że lepiej wykorzystać rzeczywiste typy MIME wyraźnie.