Одно умное решение, на которое я наткнулся в последнее время, если вы используете apache (или lighty), - это использовать mod_xsendfile (http://tn123.ath.cx/mod_xsendfile/),) модуль apache, который использует заголовок, чтобы определить, какой файл передать пользователю.
Его очень просто установить (см. Ссылку выше), а затем просто включите эти строки в файл .htaccess
:
XSendFile on
XSendFileAllowAbove on
Затем в своем php-коде сделайте что-то подобное, когда вы хотите, чтобы пользователь получил файл:
header('X-Sendfile: /var/notwebroot/files/secretfile.zip')
Apache перехватит любой ответ с заголовком X-Sendfile, и вместо отправки любого содержимого, которое вы выводите (вы также можете вернуть пустую страницу), apache доставит файл.
Это снимает с себя всякую боль, связанную с миметипами, частями и разными заголовками.