2012-05-16 7 views
33

Attualmente sto lavorando su uno script PHP che consente di scaricare contenuti multimediali (video, audio, immagini ...) dal tuo dispositivo mobile accedendo a un link. (ad esempio http://www.my-web-site.com/download.php?id=7ejs8ap) Il mio script ha funzionato molto bene quando lo stavo testando con il recente cellulare (Samsung Galaxy S, iPhone 4S, altri ...) ma si è verificato un errore sul mio vecchio cellulare Samsung C3050. I media che volevo scaricare erano solo un file audio mp3 che di solito scaricavo facilmente.Utilità dell'intestazione HTTP "Content-Type: application/force-download" per dispositivi mobili?

L'errore sembra essere "Tipo di contenuto sconosciuto". Quindi, poiché la mia sola intestazione HTTP Content-Type era "application/force-download", provo a commentare questo e riprovo. Quindi, funziona. Ma ora, attualmente sto chiedendo cosa significa questo Content-Type e se può essere obbligatorio per gli altri dispositivi mobili. Ho provato senza Content-Type su iPhone 4 e funziona, ma non sono sicuro di questa compatibilità per tutti i dispositivi mobili.

Qualcuno può spiegarmi come funziona Content-Type, perché questo non è un MIME standard o qualsiasi altra cosa che può aiutarmi ad essere sicuro che questo è un Content-Type opzionale per ogni download, qualunque sia il file, il browser o il dispositivo su cui sto scaricando?

Grazie a tutti.

Ecco il mio header PHP inviato:

<?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: Ho appena provato con un Sony Xperia, e il download non ha avuto successo: Vedo solo il "html-encoded" byte di mio file I voglio scaricare. Come posso sapere quale tipo di contenuto devo usare se application/octet-stream o application/force-download non funziona?

risposta

101

Content-Type: application/force-download significa "Io, il server web, ho intenzione di mentire a voi (il browser) su ciò che questo il file è così che non lo tratterai come PDF/Word Document/MP3/qualunque e chiederai all'utente di salvare il file misterioso sul disco ". È un trucco sporco che si interrompe orribilmente quando il client non fa "salva su disco".

Utilizzare il tipo mime corretto per qualsiasi supporto utilizzato (ad esempio audio/mpeg per mp3).

Utilizzare l'intestazione Content-Disposition: attachment; etc etc se si desidera incoraggiare il client a scaricarlo anziché seguire il comportamento predefinito.

+0

Grazie per le tue spiegazioni. Proverò più tardi l'applicazione/octet-stream e se non funziona, userò una funzione per rilevare il tipo mime da un nome file. Spero che questo funzionerà per un file "speciale" che mi piace * .m4r o * .dm per suonerie speciali per iPhone, ad esempio ... In caso contrario, farò il mio interruttore/caso indesiderato: '( – niconoe

+0

@nioconoe The il modo più semplice per capire un tipo mime per un file è la libreria fileinfo.In PHP, è http://www.php.net/manual/en/function.finfo-file.php. Puoi anche eseguire 'file --mime 'da una riga di comando. –

+0

Cosa succede se il contenuto stesso è una pagina HTML? (esempio un rapporto html)? – D34dman

12

Per scaricare un file, utilizzare il seguente codice ... Memorizzare il nome del file con la posizione nella variabile $ file. Supporta tutti i tipi 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); 

essere informato tipi Mime si prega di fare riferimento a questo link: http://php.net/manual/en/function.mime-content-type.php

+0

Anche se questa funzione è deprecata, posso leggere alcune spiegazioni sul tipo MIME, quindi grazie. Ma, non mi spiega perché application/force-download non è un tipo di contenuto riconosciuto per tutti i browser ... – niconoe

+8

Content-Description non esiste in HTTP. Content-Transfer-Encoding non esiste in HTTP. (Vedi http://www.iana.org/assignments/message-headers/perm-headers.html). Tutte le intestazioni relative alla cache sono probabilmente inutili.Infine, l'intestazione Content-Disposition non sarà valida per molti valori di $ file. Vedi RFC 6266. –

+0

Suresh, la funzione mime_content_type è ora considerata deprecata. – catfood

4

application/force-download non è un tipo MIME standard. È un hack supportato da alcuni browser, aggiunto abbastanza di recente.

La tua domanda non ha alcun senso. È come chiedere perché Internet Explorer 4 non supporta le ultime funzionalità di CSS 3.

+0

So che non è un tipo MIME standard, ma non sapevo che fosse stato aggiunto di recente. Non riesco a farmi sapere che la mia domanda non ha senso, ma perché, quando ho provato con il mio Sony Xperia senza questo "hack dei contenuti", non funziona più? Sembra che questo sarà usato per i nostri browser che non amano lavorare con standard ... – niconoe

+4

Perché per definizione quando si utilizza un tipo di contenuto non standard, l'implementazione non è definita. Qualunque cosa faccia il browser è tecnicamente "corretto". Si potrebbe facilmente impostare il tipo di contenuto su "application/sadjkfhlaksdjdkfjgh" e ottenere lo stesso identico effetto. –

Problemi correlati