Les en-Têtes HTTP pour les Téléchargements de Fichiers
J'ai écrit un script PHP qui gère les téléchargements de fichiers, la détermination de fichier qui est demandé et en définissant les en-têtes appropriés pour déclencher le navigateur pour télécharger le fichier (plutôt que de les afficher dans le navigateur).
J'ai maintenant un problème où certains utilisateurs ont signalé que certains fichiers soient identifiés de manière incorrecte (donc indépendamment de l'extension, le navigateur considère comme une image GIF). Je suppose que c'est parce que je n'ai pas mis le "Content-type" dans l'en-tête de réponse. Est-ce la plus probable? Si oui, est-il un générique type qui peut être utilisé pour tous les fichiers, plutôt que d'essayer de compte pour chaque type de fichier?
Actuellement, je suis le seul paramètre de la valeur "Content-disposition: attachment; filename=arandomf.ile"
Mise à jour: j'ai suivi ce guide ici pour construire un processus plus solide pour les téléchargements de fichiers (http://w-shadow.com/blog/2007/08/12/how-to-force-file-download-with-php/), mais il y a un délai important entre le moment où le script est exécuté et lorsque le navigateur de la boîte de dialogue de téléchargement apparaît. Quelqu'un peut-il identifier les goulots d'étranglement qui en est la cause?
Voici mon oeuvre:
/**
* Outputs the specified file to the browser.
*
* @param string $filePath the path to the file to output
* @param string $fileName the name of the file
* @param string $mimeType the type of file
*/
function outputFile($filePath, $fileName, $mimeType = '') {
//Setup
$mimeTypes = array(
'pdf' => 'application/pdf',
'txt' => 'text/plain',
'html' => 'text/html',
'exe' => 'application/octet-stream',
'zip' => 'application/zip',
'doc' => 'application/msword',
'xls' => 'application/vnd.ms-excel',
'ppt' => 'application/vnd.ms-powerpoint',
'gif' => 'image/gif',
'png' => 'image/png',
'jpeg' => 'image/jpg',
'jpg' => 'image/jpg',
'php' => 'text/plain'
);
$fileSize = filesize($filePath);
$fileName = rawurldecode($fileName);
$fileExt = '';
//Determine MIME Type
if($mimeType == '') {
$fileExt = strtolower(substr(strrchr($filePath, '.'), 1));
if(array_key_exists($fileExt, $mimeTypes)) {
$mimeType = $mimeTypes[$fileExt];
}
else {
$mimeType = 'application/force-download';
}
}
//Disable Output Buffering
@ob_end_clean();
//IE Required
if(ini_get('zlib.output_compression')) {
ini_set('zlib.output_compression', 'Off');
}
//Send Headers
header('Content-Type: ' . $mimeType);
header('Content-Disposition: attachment; filename="' . $fileName . '"');
header('Content-Transfer-Encoding: binary');
header('Accept-Ranges: bytes');
//Send Headers: Prevent Caching of File
header('Cache-Control: private');
header('Pragma: private');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
//Multipart-Download and Download Resuming Support
if(isset($_SERVER['HTTP_RANGE'])) {
list($a, $range) = explode('=', $_SERVER['HTTP_RANGE'], 2);
list($range) = explode(',', $range, 2);
list($range, $rangeEnd) = explode('-', $range);
$range = intval($range);
if(!$rangeEnd) {
$rangeEnd = $fileSize - 1;
}
else {
$rangeEnd = intval($rangeEnd);
}
$newLength = $rangeEnd - $range + 1;
//Send Headers
header('HTTP/1.1 206 Partial Content');
header('Content-Length: ' . $newLength);
header('Content-Range: bytes ' . $range - $rangeEnd / $size);
}
else {
$newLength = $size;
header('Content-Length: ' . $size);
}
//Output File
$chunkSize = 1 * (1024*1024);
$bytesSend = 0;
if($file = fopen($filePath, 'r')) {
if(isset($_SERVER['HTTP_RANGE'])) {
fseek($file, $range);
while(!feof($file) && !connection_aborted() && $bytesSend < $newLength) {
$buffer = fread($file, $chunkSize);
echo $buffer;
flush();
$bytesSend += strlen($buffer);
}
fclose($file);
}
}
}
- Même problème ici stackoverflow.com/questions/33946612/...
Vous devez vous connecter pour publier un commentaire.
Acoording à RFC 2046 (Multipurpose Internet Mail Extensions):
Donc j'irais pour que l'on.
Content-disposition
est plus correct. stackoverflow.com/questions/20508788/...Comme l'a expliqué Alex lien, vous êtes probablement manquant l'en-tête
Content-Disposition
sur le dessus deContent-Type
.Donc quelque chose comme ceci:
attachment; filename="MyFileName.ext"
. Voir w3.org/Protocols/rfc2616/rfc2616-sec19.html .Vous pouvez essayer ce la force de téléchargement de script. Même si vous ne l'utilisez pas, il va probablement vous diriger dans la bonne direction:
Content-Type: application/force-download
etContent-Transfer-Encoding: binary
ne sont pas aux normes HTTP. Ils pourraient travailler, mais qui sont inutiles ici. RFC2616: w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.17