Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
2-1283487912
Semen
2010-09-03 08:25
2010.11.28
Как сделать нормальный буффер


15-1282556497
vajo
2010-08-23 13:41
2010.11.28
Блок питания.


2-1283783053
Hapastiks
2010-09-06 18:24
2010.11.28
ini файлы


2-1283831226
03111978
2010-09-07 07:47
2010.11.28
все значения со знаком минус....


2-1283773342
guest
2010-09-06 15:42
2010.11.28
обновление датасета





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский