|
|
|
|
|
для: Лена
(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 изображения... или потока данных приложения? | |
|
|
|
|
|
|
|
для: Лена
(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 и т.д. То есть файл сразу же загружается и в базу пишется его мим-тип. А чем это плохо? | |
|
|
|
|
|
|
|
для: Лена
(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 - это что и зачем? | |
|
|
|
|
|
|
|
для: 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($fp, LOCK_EX);
fpassthru($fp);
$ob = ob_get_contents();
flock($fp, LOCK_UN);
fclose($fp);
ob_end_clean();
}
return print $ob;
}
?>
|
И хостер мне сказал, что полные пути использовать у них нельзя, только относительные.
Одно только неясно.
Беру файл в кодировке utf-8, загружаю в папку - грузится в кодировке utf-8, скачиваю файл - с начала текста в виде квадратиков - BOM. И это только на локалхосте. Почему же на сервере такого нет? | |
|
|
|
|
|
|
|
для: Лена
(19.07.2009 в 14:08)
| | >>Возможно, друпал считает пути от другой точки дерева каталогов?
>Да я и использую специальную функцию, которая строит путь к файлу.
по примеру (19.07.2009 в 00:00) этого не видно | |
|
|
|
|
|
|
|
для: Trianon
(19.07.2009 в 00:51)
| | Права на каталоге уже сделала 777.
Ни на локалхосте, ни на сервере не работает.
>Возможно, друпал считает пути от другой точки дерева каталогов?
Да я и использую специальную функцию, которая строит путь к файлу.
Полный путь указывала, все равно не видит. | |
|
|
|
|
|
|
|
для: Лена
(19.07.2009 в 00:25)
| | Если файл не находится - нужно смотреть права на каталоге.
Возможно, друпал считает пути от другой точки дерева каталогов?
Может быть стоит указать полный путь? | |
|
|
|
|
|
|
|
для: Trianon
(19.07.2009 в 00:15)
| | Права на файле. На каталоге - 755
Файл не находится.
Странно тут получается. Если исполняю тот код, что привела выше, отдельным скриптом - все получается. Только вставляю функцию в Друпал - и файл не находится. И путь, и права - все то же, а файла вроде как нет. | |
|
|
|
|
|
|
|
для: Лена
(19.07.2009 в 00:00)
| | Файл находится в нужной папке. Права - 777.
Права на файле или на каталоге?
Файл не читается или не находится? | |
|
|
|
|