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

Форум PHP

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Не читается файл

Сообщения:  [1-10]   [11-11] 

 
 автор: Trianon   (22.07.2009 в 11:17)   письмо автору
 
   для: Лена   (20.07.2009 в 14:44)
 

>>Почему не написать просто return readfile($filename); ?!
>А передачу заголовков тогда куда девать?
перед этой строкой.

>Вот эта функция - это кусок модуля. До вывода контента этого модуля уже был вывод в броузер, поэтому и решила делать через буфер, иначе возникает Cannot modify header information... Посылать заголовки раньше, вообще до всего вывода в броузер, у меня не получится. Заголовки загружаются в файле ядра. Стараюсь или вообще туда не лезть, или если лезть, то делать минимальные исправления - опыта у меня не так много, могу все завалить.

>>Если в нем BOM уже есть - само собой никто его не убирает.
>Вы не так меня поняли. Если я скачиваю файл в utf-8 и в нем уже есть BOM , который проявляется в виде квадратиков, нельзя ли эту маркировку как-нибудь убрать?

А... Так а в чем вопрос?
прочесть первые три символа, сравнить, и если оно - остальное перекачать в новый файл.
Если памяти не жалко - то просто substr($body, 3);

>>а вот это filemime - это что и зачем?
>Поле в базе. В системе существует встроенный модуль ядра, который занимается загрузкой файлов, я его немного подправила под свои нужды, но в целом оставила все, как есть, в том числе, и таблицы в базе. В поле filemime - данные в виде - image/jpeg, application/octet-stream и т.д. То есть файл сразу же загружается и в базу пишется его мим-тип.

Ясно.
>А чем это плохо?
Однако странно для произвольного типа дописывать charset.
Что такое charset изображения... или потока данных приложения?

  Ответить  
 
 автор: STEVER   (22.07.2009 в 11:08)   письмо автору
 
   для: Лена   (20.07.2009 в 14:44)
 

не понимаю в чем проблема: неужели так сложно отдебажить этот маленький кусочек кода, а не гадать что и где не работает?

  Ответить  
 
 автор: Лена   (20.07.2009 в 14:44)   письмо автору
 
   для: Trianon   (19.07.2009 в 21:29)
 

>Почему не написать просто return readfile($filename); ?!
А передачу заголовков тогда куда девать?
Вот эта функция - это кусок модуля. До вывода контента этого модуля уже был вывод в броузер, поэтому и решила делать через буфер, иначе возникает Cannot modify header information... Посылать заголовки раньше, вообще до всего вывода в броузер, у меня не получится. Заголовки загружаются в файле ядра. Стараюсь или вообще туда не лезть, или если лезть, то делать минимальные исправления - опыта у меня не так много, могу все завалить.

>Если в нем BOM уже есть - само собой никто его не убирает.
Вы не так меня поняли. Если я скачиваю файл в utf-8 и в нем уже есть BOM , который проявляется в виде квадратиков, нельзя ли эту маркировку как-нибудь убрать?

>а вот это filemime - это что и зачем?
Поле в базе. В системе существует встроенный модуль ядра, который занимается загрузкой файлов, я его немного подправила под свои нужды, но в целом оставила все, как есть, в том числе, и таблицы в базе. В поле filemime - данные в виде - image/jpeg, application/octet-stream и т.д. То есть файл сразу же загружается и в базу пишется его мим-тип. А чем это плохо?

  Ответить  
 
 автор: Trianon   (19.07.2009 в 21:29)   письмо автору
 
   для: Лена   (19.07.2009 в 21:15)
 

вот это
    
ob_start(); 
//...
  $fp = fopen($filename, 'r');
      flock($fp, LOCK_EX);
      fpassthru($fp);
         $ob = ob_get_contents();
      flock($fp, LOCK_UN);
      fclose($fp);
ob_end_clean();
}
return print $ob;

это редкой силы сюрр.

Здесь одна часть строк (fopen, fpassthru) относится к методике, которая ставит целью возможность отдачи больших объектов не загружая ими память процесса.
А другая (ob_start, ob_get_contents) - ровно наоборот, затолкать всё в память.
Сказал бы я как это называется, не будь Вы женщиной...

Почему не написать просто return readfile($filename); ?!

>И хостер мне сказал, что полные пути использовать у них нельзя, только относительные.

Вот в это верится с трудом... я не представляю, как такое реализовать, но раз говорит - может и вправду...

>Одно только неясно.
>Беру файл в кодировке utf-8,

Пркрепите чтоли сюда этот файл...
Если в нем BOM уже есть - само собой никто его не убирает.
Если нету - добавлять вроде тоже некому.

а вот это filemime - это что и зачем?

  Ответить  
 
 автор: Лена   (19.07.2009 в 21:15)   письмо автору
 
   для: Trianon   (19.07.2009 в 15:09)
 

Получилось. Ошибка была в том, что я использовала встроенную submit-функцию формы(нажимаешь на кнопку формы - выдается книга). Как мне сказали на форуме поддержки Друпала, эта функция контент не выдает.
Сделала обычный колбэк - и все получилось.

>по примеру (19.07.2009 в 00:00) этого не видно
этот пример я адаптировала для посетителей форума, поэтому друпаловские функции не использовала :)
Оригинал(упрощенный вариант) такой:

<?php
function library_myupload() {
ob_start();
//получаем нужную книгу по ссылке 
$id arg(3);
//выбираем название книги, путь и расширение файла из базы 
 
$result db_query("SELECT lb.description description, 
                            f.filename ffn, 
                            lb.hash hash, 
                            n.title, 
                            f.filepath fp,
                            f.filemime ffm, 
                            f.filesize 
                    FROM {upload} lb
                    JOIN {node} n ON lb.nid = n.nid
                    JOIN {files} f ON lb.fid = f.fid
                    WHERE n.nid = %d"
$id); 
                    if(!
$result) return drupal_not_found();
  while(
$row db_fetch_object($result)){
  
$filename file_create_url($row->ffn);
  if (!
file_exists($filename)) drupal_set_message('Файл '  $filename ' не найден');
    
drupal_set_header("Content-Type:" $row->ffm "; charset=utf8");
    
drupal_set_header("Content-Length: " filesize($filename));
    
drupal_set_header("Content-Disposition: attachment; filename=" basename($filename));
      
$fp fopen($filename'r');
      
flock($fpLOCK_EX);
      
fpassthru($fp);
         
$ob ob_get_contents();
      
flock($fpLOCK_UN);
      
fclose($fp);
ob_end_clean();
}
return print 
$ob;
}
?>


И хостер мне сказал, что полные пути использовать у них нельзя, только относительные.
Одно только неясно.
Беру файл в кодировке utf-8, загружаю в папку - грузится в кодировке utf-8, скачиваю файл - с начала текста в виде квадратиков - BOM. И это только на локалхосте. Почему же на сервере такого нет?

  Ответить  
 
 автор: Trianon   (19.07.2009 в 15:09)   письмо автору
 
   для: Лена   (19.07.2009 в 14:08)
 

>>Возможно, друпал считает пути от другой точки дерева каталогов?
>Да я и использую специальную функцию, которая строит путь к файлу.


по примеру (19.07.2009 в 00:00) этого не видно

  Ответить  
 
 автор: Лена   (19.07.2009 в 14:08)   письмо автору
 
   для: Trianon   (19.07.2009 в 00:51)
 

Права на каталоге уже сделала 777.
Ни на локалхосте, ни на сервере не работает.

>Возможно, друпал считает пути от другой точки дерева каталогов?
Да я и использую специальную функцию, которая строит путь к файлу.
Полный путь указывала, все равно не видит.

  Ответить  
 
 автор: Trianon   (19.07.2009 в 00:51)   письмо автору
 
   для: Лена   (19.07.2009 в 00:25)
 

Если файл не находится - нужно смотреть права на каталоге.
Возможно, друпал считает пути от другой точки дерева каталогов?
Может быть стоит указать полный путь?

  Ответить  
 
 автор: Лена   (19.07.2009 в 00:25)   письмо автору
 
   для: Trianon   (19.07.2009 в 00:15)
 

Права на файле. На каталоге - 755
Файл не находится.
Странно тут получается. Если исполняю тот код, что привела выше, отдельным скриптом - все получается. Только вставляю функцию в Друпал - и файл не находится. И путь, и права - все то же, а файла вроде как нет.

  Ответить  
 
 автор: Trianon   (19.07.2009 в 00:15)   письмо автору
 
   для: Лена   (19.07.2009 в 00:00)
 

Файл находится в нужной папке. Права - 777.

Права на файле или на каталоге?

Файл не читается или не находится?

  Ответить  

Сообщения:  [1-10]   [11-11] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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