Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.11.28;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.011 c
2-1283506544
alles
2010-09-03 13:35
2010.11.28
Проблема с формами в разных dll


2-1283338021
azamatufa
2010-09-01 14:47
2010.11.28
DBE forever )


15-1282595385
Юрий
2010-08-24 00:29
2010.11.28
С днем рождения ! 24 августа 2010 вторник


15-1282036243
Scot Storch
2010-08-17 13:10
2010.11.28
ООП


15-1282234661
Неокубинец
2010-08-19 20:17
2010.11.28
шумодав