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

Форум PHP

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

 

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

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

тема: Проблема с отдачей файла через header
 
 автор: selma   (05.03.2011 в 03:16)   письмо автору
 
 

Всем здрасте!

есть ссылка вида: file.php?id=#ID

где ID - идентификационный номер на ссылку файла в БД (ссылка на файл в виде: имя_файла.расширение)

CREATE TABLE IF NOT EXISTS `table_link` (
  `id` int(9) NOT NULL AUTO_INCREMENT,
  `linka` varchar(30) CHARACTER SET utf8 NOT NULL,
  `times` varchar(10) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6;

--
-- Дамп данных таблицы
--

INSERT INTO `table_link` (`id`, `linka`, `times`) VALUES
(1, 'vj4cPe1A4U.doc', '1296031983'),
(2, 'wcN5YVYlTk.doc',  '1296031983'),
(3, 'IdI3miZOaw.doc',  '1296031983'),
(4, '2z94SiJXzs.doc', '1296031983'),
(5, 'UTcYqkuAv3.doc', '1296032387');


после перехода по ссылке в файле file.php


<?
if(isset($_GET['id']) && is_numeric($_GET['id']))
  {
  include (
'connect.php'); // Соединяемся с БД 
  //Выбираем нужную ссылку на файл
  
$sql mysql_query("SELECT * FROM `table_link` WHERE `id`='".intval($_GET['id'])."' LIMIT 1");
  
$arr mysql_fetch_assoc($sql);
  
$arr['linka'] = htmlspecialchars($arr['linka']);
  
//получаем путь и имя файла 
  
$fp realpath("docs/".$arr['linka']);
//читаем файл 
  
if (file_exists($fp))
    {
    
$f fopen($fp'rb'); 
    
//Определяем MIME тип исходя из ссылки (думаю в будущем определять сам файл на тип)
    
$aplic explode('.',$arr['linka']);
    if (
$aplic[1]=='doc' or $aplic[1]=='rtf')  $ap 'application/msword';
    elseif (
$aplic[1]=='xls')  $ap 'application/x-msexcel';
    elseif (
$aplic[1]=='jpe' or $aplic[1]=='jpeg' or $aplic[1]=='jpg')  $ap 'image/jpeg';
    
//тип файла  
    
header('Content-Type: '.$ap);
    
//размер файла  
    
header("Content-Length: ".filesize($fp)); 
    
//имя файла  
    
header("Content-Disposition: attachment; filename=Файл скачан: (".date("H-i-s d.m.y").").".$aplic[1]); 
    
//выводим файл пользователю  
    
fpassthru($f);  
    exit();  
    }
  else { echo 
"Такого файла не существует!"; }
  }
else { echo 
"Ссылки на файл не существует!"; }
?>


Проблема: Размер файла и его тип определяет верно, а вот Содержимое DOC файлов сохраняет в крякозябрах...подскажите причины

  Ответить  
 
 автор: sim5   (05.03.2011 в 04:21)   письмо автору
 
   для: selma   (05.03.2011 в 03:16)
 

$arr['linka'] = htmlspecialchars($arr['linka']);
header("Content-Disposition: attachment; filename=Файл скачан: (".date("H-i-s d.m.y").").".$aplic[1]);

Это что такое?

  Ответить  
 
 автор: selma   (09.03.2011 в 02:02)   письмо автору
 
   для: sim5   (05.03.2011 в 04:21)
 

$arr['linka'] = htmlspecialchars($arr['linka']); Это на всякий случай (без этого тоже НЕ работает)

header("Content-Disposition: attachment; filename=Файл скачан: (".date("H-i-s d.m.y").").".$aplic[1]); Отдаю файл и присваиваю свое имя.

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

  Ответить  
 
 автор: cheops   (09.03.2011 в 11:01)   письмо автору
 
   для: selma   (09.03.2011 в 02:02)
 

Вы присваиваете filename имя файла с пробелами и русскими буквами, попробуйте сформировать имя без них - ситуация не меняется?

  Ответить  
 
 автор: selma   (10.03.2011 в 01:54)   письмо автору
 
   для: cheops   (09.03.2011 в 11:01)
 

называла даже mt_rand(9,999); результат тот же, ума не приложу что не так....

  Ответить  
 
 автор: Trivium   (10.03.2011 в 15:14)   письмо автору
 
   для: selma   (10.03.2011 в 01:54)
 

В мануале есть пример вывода с использованием функции readfile: http://ua2.php.net/manual/en/function.readfile.php

  Ответить  
 
 автор: selma   (11.03.2011 в 02:32)   письмо автору
 
   для: Trivium   (10.03.2011 в 15:14)
 

Точно!!! как я забыла про readfile...где то читала, что он потребляет больше серверных рессурсов (если не так, было бы полезно почитать) НО Главное работает отлично! Спасибо Trivium

  Ответить  
Rambler's Top100
вверх

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