Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Скрыть реальный путь файла
 
 автор: Visavi   (22.03.2008 в 21:10)   письмо автору
 
 

Помогите пожалуйста понять где ошибка
Нужно сделать на сайте чтобы можно было скачать файл не зная где он лежит
Пишу вот такой код

<?
//Тут идут всякие функции 
//все только в буфере, никакого вывода

ob_end_clean();        

$files="file.zip";
$filename "download/$files";
$filesize filesize($filename);  

header('Content-Disposition: attachment; filename="'.$files.'";'); 
header('Content-type: application/zip'); 
header('Content-Length: '.$filesize);

           
fpassthru(fopen($filename'rb'));
exit;

//пробовал и так
ob_end_clean();        

$files="file.zip";
$filename "download/$files";
$filesize filesize($filename);  

header('Content-Disposition: attachment; filename="'.$files.'";'); 
header('Content-type: application/zip'); 
header('Content-Length: '.$filesize);
$fp fopen($filename'rb');  
           
$content fread($fp$filesize);  
           
fclose($fp);  
           print 
$content;  

exit;

//и даже вот так

$filename file_get_contents("download/$files");
header('Content-Disposition: inline; filename="'.$files.'";');
header("Content-type: application/zip");
header("Content-Length: ".strlen($filename));
echo 
$filename

?>


все равно у некоторых скачивается нормально, у некоторых получается битый архив, хотя файлы тоже есть, просто не могут их извлечь
в чем может быть ошибка

   
 
 автор: Atheist   (22.03.2008 в 21:55)   письмо автору
 
   для: Visavi   (22.03.2008 в 21:10)
 

> $content = fread($fp, $filesize);
> $filename = file_get_contents("download/$files");

Какая мерзость. filesize нужно получать через filesize(), а выводить readfile'ом. Единственное, что первый код выглядит получше остальных.

> ob_end_clean
Это очистка буфера вывода. Что вообще это тут делает?

   
 
 автор: Visavi   (22.03.2008 в 23:36)   письмо автору
 
   для: Atheist   (22.03.2008 в 21:55)
 

У меня до этого кода идут некоторые данные в буфер я его очищаю чтобы данные не смешивались, у меня работаю все 3 кода без проблем, однако у некоторых имеются проблемы, архивы получаются битыми

> Какая мерзость. filesize нужно получать через filesize(), а выводить readfile'ом
можно подробнее о чем вы
в 1 варианте какие недостатки

   
 
 автор: Atheist   (23.03.2008 в 00:21)   письмо автору
 
   для: Visavi   (22.03.2008 в 23:36)
 

> можно подробнее о чем вы
Функциями file_get_contents() и, естественно, fread'ом, где вторым агрументом передан размер всего файла, ты забиваешь всю информацию в оперативную память. Файл может весить несколько мегабайт и тут начнутся проблемы: превышение лимита выделяемой для PHP-скрипта памяти (обычно 8Mb). Лучше перекладывать больше работы на процессор.

> архивы получаются битыми
Лучше добавь такие строки в начало скрипта:

<?php
error_reporting
E_ALL );
ini_set('display_errors'0);
ini_set('html_tags'0);
ini_set('error_log''error_log.txt');
?>


Создай файл error_log.txt и поставь ему права, позволяющие изменять файл из-под PHP (Apache, даже точнее, если PHP как модуль). По ошибкам можно будет определить где баг.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования