2012-01-31 2 views
1

У меня есть htaccess защищенная паролем папка с несколькими файлами в ней. Пользователям запрещается доступ ко всем файлам, но им разрешено загружать их самостоятельно.Скопируйте и загрузите файл в htaccess защищенную папку

Поскольку я не могу напрямую связать файл, и поскольку копирование/удаление не является реальным решением, я думал, что просто открою файл с помощью file_get_contents и повторю его обратно на страницу, используя правый заголовок. Но .. я не понимаю, как это работает. Вот мой код. Ошибка, которую я получаю, заключается в том, что при открытии файла я получаю ошибку «файл поврежден» от Acrobat.

<?php 
$file = "cms/docs/5641-1.pdf"; 
header('Content-Description: File Transfer'); 
header('Content-type: application/pdf'); 
header('Content-Disposition: attachment; filename='.basename("exoticfilename.pdf")); 
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)); 
if (file_exists($file)) 
{ 
    echo file_get_contents($file); 
} 
?> 

Кроме того, в этом примере я просто использую PDF-файл, но есть несколько типов файлов. Поэтому я должен, вероятно, изменить заголовок в зависимости от типа файла. Есть ли решение для этого, или я должен просто использовать очень длинный оператор if/else?

Если есть другой, лучший способ, я открыт для этого.

UPDATE

Вышеуказанные работы, но не со всеми файлами. Старые PDF-файлы (Acrobat 6) не работают, но файлы Acrobat X делают. То же самое относится к файлам docx. Некоторые работают, другие - нет. Очень странно, так как я могу открыть все прямо на моем ПК. Я предполагаю, что это имеет какое-то отношение к строке приложения/pdf (или application/vnd.openxmlformats-officedocument.wordprocessingml.document для docx). Все остальные, как изображения, работают.

+0

Я скопировал ваш код, и он отлично работает. Попробуйте добавить 'die()' после 'file_get_contents' – Narek

+0

Спасибо, Нарек. Я попробовал die(), но это не сработало. Я просто тестировал его со старым PDF-файлом, и это работает. Может быть, что-то не так в заголовке файла? Возможно ли какой-то «общий» заголовок, который я могу использовать для разных PDF, DocX, Tiffs и т. Д.? Я имею в виду в этом заголовке строки ('Content-type: application/pdf'); – mat

+0

@mat, я вижу вашу мысль, я удалю мои предыдущие комментарии, поскольку они кажутся неуместными. – Jacco

ответ

0

Поскольку вы используете htaccess/htpasswd для защиты каталога от горячих пиявок. Вы непреднамеренно блокируете доступ к файлам из внешнего источника, такого как браузер с клиентской стороны. Поскольку каталог требует аутентификации для доступа к файлам внутри него, вам нужно создать скрипт вокруг него. В некотором смысле аутентификация через сценарий. Я видел, как это делали раньше, и вы можете найти один из многих ссылок на эту тему здесь http://koivi.com/php-http-auth/

но нижняя линия Htaccess и Htpasswd над запускать скрипты, даже если на том же хосте, так как они в отсутствие лучшего уровня сервера описания, запускался до того, как даже php запускает свой процесс при загрузке страницы.

+0

Не полностью, так как я могу загрузить файлы. Даже правильные файлы иногда, но старые PDF-файлы, похоже, вызывают проблему. То же самое относится к старым файлам doc. – mat

Смежные вопросы