Форум: "Прочее";
Текущий архив: 2010.11.28;
Скачать: [xml.tar.bz2];
Внизphp, странности с именем файла Найти похожие ветки
← →
php (2010-08-19 09:00) [0]суть происходящего:
с некоего шттп сервера скачивается обновление баз нода.
сначала тянется файл "update.ver", затем он парсится и из него извлекаются имена всех обновлений.
затем все эти обновления по списку выкачиваются с того же сервера.
для этого у меня реализована функция _get_file_from_web($fname)
сама по себе она отлажена и проверена. файлы качаются как положено.
первый ее вызов идет с параметром-константой
_get_file_from_web("update.ver");
все последующие вызовы делаются с переменной, содержащей имя обновления:
_get_file_from_web($file_name);
внутри функции есть такой код:
echo "creating new file: $fname<br/>";
$f = fopen($fname, "w+");
то есть просто создаем новый файл с указанным именем и сбрасываем в него скачанное содержимое.
дык вот сама проблема:
когда вызываем функцию с фиксированным именем файла (литерал) - файл и качается верно и сохраняется верно.
а когда вызываем функцию с переменной, в которой очередное имя файла - то файл качается верно, качается именно тот файл, который надо, но фопен создает файл не с указанным именем, а с именем похожим на темповое. то есть набор буков, тильда и так далее.
причем еко на экран выводит правильные имена.
← →
xayam © (2010-08-19 09:15) [1]код давай весь :) А вообще зачем функция _get_file_from_web, если есть file_get_contents() ?
← →
xayam © (2010-08-19 09:48) [2]и сохранять может с помощью file_put_contents() ?
← →
php (2010-08-19 10:19) [3]да код в порядке.
попробуйте абстрагироваться от него.
есть функция со строковым параметром.
она что-то там делает. причем проверено, что делает она это правильно.
но есть одно но.
внутри делается fopen с переданным параметром.
если параметр-литерал, появляется файл с именем как в литерале.
если параметр не литерал, а переменная, то имя создаваемого файла случайное.
собстно код приведен в самом вопросе.
вы же видите, что делается echo имени, а я вижу, что оно такое как надо.
затем делается фопен с тем же самым именем.
вот и все.
← →
php (2010-08-19 10:22) [4]А вообще зачем функция _get_file_from_web, если есть file_get_contents() ?
да какая разница.
сделаю я file_get_contents(), а затем надо будет тот же самый фопен вызывать чтобы сбросить контент.
проблема-то не в получении контента, а в вызове fopen для создания файла.
← →
xayam © (2010-08-19 10:24) [5]
> php (19.08.10 10:19) [3]
> попробуйте абстрагироваться от него.
для начала, попробую абстрагироваться и от всего остального :) Возможно обновлять нод не нужно...
← →
xayam © (2010-08-19 10:25) [6]
> а затем надо будет тот же самый фопен вызывать чтобы сбросить
> контент
[2] и сохранять может с помощью file_put_contents() ?
← →
php (2010-08-19 10:40) [7]да не помогает этот file_put_contents. Он же просто есть комбинация все тех же fopen fwrite fclose.
Сейчас только попробовал - имя локального файла получается вида "ND9OID~K"
← →
php (2010-08-19 10:41) [8]ну и как обычно, с параметром-литалом все работает замечательно, как и в предыдущем варианте.
← →
php (2010-08-19 10:46) [9]может здесь юникод какой-нить виноват?
дело происходит на линуксе, ext3.
Но это не PC, а эмбеддед-система.
← →
xayam © (2010-08-19 10:53) [10]может переименовать попробовать? rename, dirname
← →
xayam © (2010-08-19 11:08) [11]хотя видимо есть ограничение в системе на имя файла в 8 символов и это не поможет
← →
php (2010-08-19 11:19) [12]нету там ограничений на имена.
с торрентов льются файлы с длиннющими именами, русскими, латинскими и прочими.
← →
xayam © (2010-08-19 11:31) [13]не переименовалось?
ограничение может задаваться какими-нибудь настройками.
← →
php (2010-08-19 11:43) [14]выход конечно есть.
первый php скрипт сначала вытягивает update.ver, затем формирует второй php файл с телом программы вынимающей все остальные файлы (имена там будут литералами)
затем первый скрипт запускает второй.
но хотелось бы понять физику и химию прцесса. почему такое происходит.
← →
xayam © (2010-08-19 11:51) [15]ну это проблема не php, а таинственной системы :)
← →
php (2010-08-19 12:18) [16]а может все таки виновато пхп?
пример:
качаем один и тот же файл.
первый раз используем имя-литерал и получаем на диске что и хотели.
второй раз качаем с именем-переменной, которое вычисляется.
вычисляется верно (это видно из echo)
качается верно (сравнивал побайтно с копией, выкачанной регетом)
а сохраняется с неверным именем.
то есть файловая система как бы и не виновата
← →
antonn © (2010-08-19 12:57) [17]кодировка в переменной какая?
без кода обсуждать нечего
← →
php (2010-08-19 14:02) [18]
<?php
function _http_get_file($fname)
{
$pref = "http://x.x.x.x:8081/";
file_put_contents($fname,file_get_contents($pref.$fname));
return true;
}
echo "start work<br/>";
_http_get_file("update.ver");
$lines = file("update.ver");
foreach($lines as $single_line)
{
$i = preg_match("/file=.+nup/i",$single_line);
if ($i > 0)
{
$p_name = preg_replace("/file=/i","",$single_line);
echo $p_name . "<br/>";
_http_get_file($p_name);
}
}
echo "done<br/>";
?>
имена читаются из update.ver, который не юникодный, и содержит только ascii символы. (русских буков нету)
← →
xayam © (2010-08-19 14:11) [19]
> $lines = file("update.ver");
> ...
> $p_name = preg_replace("/file=/i","",$single_line);
перевод строки в $single_line не обрезается ?
← →
xayam © (2010-08-19 14:15) [20]по коду получается что $p_name в конце с переводом строки \n, что есть "плохо", из-за этого видимо и проблема.
← →
php (2010-08-19 14:18) [21]угу, так и есть #13#10 было не оттримлено.
тоже только что увидел.
← →
Anatoly Podgoretsky © (2010-08-19 14:33) [22]#13#10 и Линукс, надо очень стараться. В Линукс конец строки #10
← →
php (2010-08-19 14:40) [23]Было именно #13#10.
Увидел это после того, как зашел браузером в каталог скачанног (дир листинг разрешен)
Нажимаю на скачать - получаю отлуп что ссылка нерабочая. А в адресной строке в конце файла - #13#10
← →
xayam © (2010-08-19 14:45) [24]
> Anatoly Podgoretsky © (19.08.10 14:33) [22]
> #13#10 и Линукс, надо очень стараться.
а чего удивительного, файл же удаленный
← →
antonn © (2010-08-19 14:51) [25]
> Anatoly Podgoretsky © (19.08.10 14:33) [22]
>
> #13#10 и Линукс, надо очень стараться. В Линукс конец строки
> #10
не надо стараться, достаточно получить текст подготовленный под виндой
← →
Anatoly Podgoretsky © (2010-08-19 15:08) [26]> xayam (19.08.2010 14:45:24) [24]
Я вижу, что у него наоборот. Тогда просто, редактируем Виндоус редактором.
Многие Линукс приложения не могут это понять, но нормально написаные едят в
любом виде.
← →
xayam © (2010-08-19 15:34) [27]
> php$p_name = preg_replace("/file=/i","",$single_line);
Не так должно быть?$p_name = preg_replace("/file=/i", "", $i);
← →
xayam © (2010-08-19 15:56) [28]упс, ошибся, там же целое должно быть
← →
xayam © (2010-08-19 15:58) [29]
$i = preg_match("/file=.+nup/i", $single_line, $match);
if ($i > 0)
{
$p_name = preg_replace("/file=/i","", $match[0]);
echo $p_name . "<br/>";
_http_get_file($p_name);
}
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2010.11.28;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.004 c