2012-05-16 7 views
33

Obecnie pracuję nad skryptem PHP, który pozwala pobierać zawartość multimedialną (wideo, audio, zdjęcia ...) z urządzenia mobilnego, uzyskując dostęp do łącza. (tj. http://www.my-web-site.com/download.php?id=7ejs8ap) Mój skrypt działał bardzo sprawnie, kiedy testowałem go z najnowszymi telefonami (Samsung Galaxy S, iPhone 4S, kilka innych ...), ale wystąpił błąd na moim starym telefonie komórkowym Samsung C3050. Nośniki, które chciałem ściągnąć, to zwykły plik audio mp3, który zwykle łatwo ściągam.Narzędzie nagłówka HTTP "Content-Type: application/force-download" dla urządzeń mobilnych?

Błąd pojawia się jako "Nieznany typ zawartości". Ponieważ moim jedynym nagłówkiem HTTP Content-Type było "application/force-download", próbuję to skomentować i spróbować ponownie. Wtedy to działa. Ale obecnie pytam, co oznacza ten typ treści i czy może być obowiązkowe dla innych użytkowników urządzeń przenośnych. Testowałem bez Content-Type na iPhone 4 i to działa, ale nie jestem pewien tej kompatybilności dla wszystkich urządzeń mobilnych.

Czy ktoś może mi wyjaśnić, jak działa ten typ zawartości, dlaczego nie jest to standardowy MIME lub wszystko inne, co może mi pomóc w upewnieniu się, że jest to opcjonalny typ zawartości dla każdego pobrania, niezależnie od pliku, przeglądarki lub urządzenie, które pobieram?

Dziękuję wszystkim.

tu jest moje nagłówki PHP wysłany:

<?php 
//Assume that $filename and $filePath are correclty set. 
header('Content-Description: File Transfer'); 
header('Content-Disposition: attachment; filename="'.$filename.'"'); 
// header('Content-Type: application/force-download'); Non-standard MIME-Type, incompatible with Samsung C3050 for example. Let it commented 
readfile($filePath); 
?> 

EDIT: Próbowałem tylko z Sony Xperia, a pobieranie nie powiodło się: ja tylko zobaczyć "html zakodowany" bajtów moim pliku I chcesz pobrać. Skąd wiadomo, jakiego typu zawartości muszę użyć, jeśli aplikacja/oktet-stream lub application/force-download nie działa?

Odpowiedz

101

Content-Type: application/force-download oznacza „Ja, serwer WWW, zamierzam kłamać (przeglądarki) o co w tym plik jest taki, że nie potraktujesz go jako dokumentu PDF/Word/MP3/cokolwiek, i poprosisz użytkownika o zapisanie tajemniczego pliku na dysku ". To jest brudny hack, który łamie się okropnie, gdy klient nie robi "zapisywania na dysku".

Użyj prawidłowego typu MIME dla dowolnego używanego nośnika (np. audio/mpeg dla mp3).

Użyj nagłówka Content-Disposition: attachment; etc etc, jeśli chcesz zachęcić klienta do pobrania go zamiast zachowania domyślnego.

+0

Dziękuję za wyjaśnienia. Spróbuję później aplikacji/strumienia oktetowego, a jeśli to nie zadziała, użyję funkcji do wykrycia typu mime z nazwy pliku. Mam nadzieję, że to zadziała w przypadku jakiegoś "specjalnego" pliku, jaki mam * .m4r lub * .dm na specjalne dzwonki na iPhone'a na przykład ... Jeśli nie, zrobię mój własny niechciany przełącznik/obudowę: '( – niconoe

+0

@nioconoe The Najłatwiejszym sposobem wykrycia typu mime dla pliku jest biblioteka fileinfo. W PHP jest to http://www.php.net/manual/en/function.finf-file.php. Możesz także uruchomić plik 'file --mime 'z linii poleceń: –

+0

Co, jeśli sama treść jest stroną html (np. raport html)? – D34dman

12

Aby pobrać plik, użyj następującego kodu ... Zapisz nazwę pliku z lokalizacją w zmiennej $ file. Obsługuje wszystkie typy MIME

$file = "location of file to download" 
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, post-check=0, pre-check=0'); 
header('Pragma: public'); 
header('Content-Length: ' . filesize($file)); 
ob_clean(); 
flush(); 
readfile($file); 

wiedzieć o typy MIME zapoznaj się z tym linkiem: http://php.net/manual/en/function.mime-content-type.php

+0

Chociaż ta funkcja jest nieaktualna, mogę przeczytać kilka wyjaśnień na temat typu MIME, więc dziękuję. Ale to nie wyjaśnia, dlaczego aplikacja/force-download nie jest rozpoznawalnym typem treści dla wszystkich przeglądarek ... – niconoe

+8

Opis zawartości nie istnieje w HTTP. Content-Transfer-Encoding nie istnieje w HTTP. (Zobacz http://www.iana.org/assignments/message-headers/perm-headers.html). Wszystkie nagłówki związane z pamięcią podręczną są prawdopodobnie bezużyteczne.Na koniec nagłówek Content-Disposition będzie niepoprawny dla wielu wartości pliku $. Zobacz RFC 6266. –

+0

Suresh, funkcja mime_content_type jest obecnie uważana za przestarzałą. – catfood

4

application/force-download nie jest standardowym typem MIME. To hack obsługiwany przez niektóre przeglądarki, dodane dość niedawno.

Twoje pytanie nie ma żadnego sensu. To tak, jakby zadać pytanie, dlaczego Internet Explorer 4 nie obsługuje najnowszej funkcjonalności CSS 3.

+0

Wiem, że nie jest to standardowy typ MIME, ale nie wiedziałem, że został dodany ostatnio. Rozumiem, że mówisz mi, że moje pytanie nie ma sensu, ale dlaczego, kiedy próbowałem z moim Sony Xperią bez tego "haka Content-Type", to już nie działa? Wygląda na to, że będzie to używane w naszych przeglądarkach, które nie lubią pracy ze standardem ... – niconoe

+4

Ponieważ z definicji, gdy używasz niestandardowego typu zawartości, implementacja jest niezdefiniowana. Wszystko, co robi przeglądarka, jest technicznie "poprawne". Równie łatwo można ustawić typ zawartości na "application/sadjkfhlaksdjdkfjgh" i osiągnąć dokładnie ten sam efekt. –

Powiązane problemy