Вы должны указать Content-Transfer-Encoding
.Кроме того, вы должны указать filename
на вашем Content-Disposition
.
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-Disposition: attachment; filename="'.$file.'"');
readfile('http://localhost/myapp/'.$file);
exit;
Важно включать двойные кавычки вокруг filename
, поскольку это требуется для RFC 2231 .Известно, что Firefox испытывает проблемы с загрузкой файлов с пробелами в имени файла, если filename
не заключен в кавычки.
Кроме того, проверьте, чтобы после закрытия ?>
не было пробелов.Если после закрывающего тега PHP даже есть пробел, заголовки не будут отправлены в браузер.
В качестве примечания, если у вас есть несколько общих типов файлов, которые вы собираетесь предлагать для загрузкиВы могли бы рассмотреть возможность определения этих типов MIME.Это обеспечивает лучший опыт для конечного пользователя.Например, вы можете сделать что-то вроде этого:
//Handles the MIME type of common files
$extension = explode('.', $file);
$extension = $extension[count($extension)-1];
SWITCH($extension) {
case 'dmg':
header('Content-Type: application/octet-stream');
break;
case 'exe':
header('Content-Type: application/exe');
break;
case 'pdf':
header('Content-Type: application/pdf');
break;
case 'sit':
header('Content-Type: application/x-stuffit');
break;
case 'zip':
header('Content-Type: application/zip');
break;
default:
header('Content-Type: application/force-download');
break;
}