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