За последние 24 часа нас посетили 17497 программистов и 1724 робота. Сейчас ищут 856 программистов ...

fopen() плюёт на атрибут b

Тема в разделе "Прочие вопросы по PHP", создана пользователем VirHos, 20 мар 2008.

  1. VirHos

    VirHos Активный пользователь

    С нами с:
    20 мар 2008
    Сообщения:
    5
    Симпатии:
    0
    Функция фопен плюёт на приписку к r - b. Даже если написать t, она будет выдавать файл в различных интерпритациях на разных операционных системах по-разному.
    Код (Text):
    1.    
    2.         ...
    3.         $handle = fopen($filename, 'rb');
    4.     if ($handle === false) {
    5.         return false;
    6.     }
    7.     while (!feof($handle)) {
    8.         $buffer = fread($handle, $chunksize);
    9.         echo $buffer;
    10.     }
    11.         ...
    Я что-то делаю не так? o_O
     
  2. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    а что такое "b" ? В доке я такого не нашёл.
     
  3. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    RomanBush, ключ b это бинарно-безопасный режим: rb (чтения), wb (записи).
     
  4. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Мда? И где об этом сказано? В дельфях?
     
  5. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    RomanBush
    Не спитцца? :)
    З.ы
    это по твоей же ссылке :)
     
  6. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    мда. Низаметил.
     
  7. Anonymous

    Anonymous Guest

    Версия ПХП какая?
     
  8. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    VirHos
    Попробуй file_get_contents. Она всегда работает в бинарном режиме.
     
  9. VirHos

    VirHos Активный пользователь

    С нами с:
    20 мар 2008
    Сообщения:
    5
    Симпатии:
    0
    Вообще не хотелось бы использовать данную функцию... Ибо получаю файл с фтп и выдаю клиенту, конечно криво, но ничего поделать не могу.
    Версия пхп 5.2.3
     
  10. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    А с ftp как получаешь? Может быть, оно оттуда уже ползёт в ASCII mode, а не в binary mode?
     
  11. VirHos

    VirHos Активный пользователь

    С нами с:
    20 мар 2008
    Сообщения:
    5
    Симпатии:
    0
    В $filename передаётся ссылка с логином и паролем.
     
  12. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    o_0
    Ща блондиночный вопрос:
    В чем будет разница:
    PHP:
    1.  
    2. <?
    3. $file=file_get_contents($filename);
    4.  
    и
    PHP:
    1.  
    2. <?
    3. $fp=fopen($filename,'r');
    4. $fa=fread($fp);
    5. foreach($fa as $string)
    6. {
    7.   $file.=$string;
    8. }
    9.  
    ?
     
  13. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    [vs], "пацаны, а я вааааще не в курсе" (с) Полотенчико из "Саут парка". Приведённый тобой код с foreach это что-то неожиданное по многим параметрам. :) Чти мать, отца и мануал. :)

    Если ты имел в виду
    Код (Text):
    1. while (!feof($fp))
    2.     $file .= fread($fp, 1024);
    То что лучше: брать кусками или всё сразу? Особенно если файл большой. Очевидно.

    Если ты имел в виду такое
    Код (Text):
    1. $file = fread($fp, filesize($filename));
    То, вроде как, никакой разницы.
     
  14. RomanBush

    RomanBush Активный пользователь

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    В том, что вот здесь сказано:
    Правда, я не понял - влияет ли это как-то на файлы, открытые по ftp или http протоколу.

    VirHos
    Я что-то не пойму, а чем не нравятся специально под работу с ftp заточенные функции? Например, ftp_fget.
     
  15. VirHos

    VirHos Активный пользователь

    С нами с:
    20 мар 2008
    Сообщения:
    5
    Симпатии:
    0
    Эти функции записывают файл с фтп в локальный файл.
     
  16. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    VirHos
    Дык... пользуйся copy(). Согласно документации, эта функция понимает http:// и ftp:// адреса.
     
  17. VirHos

    VirHos Активный пользователь

    С нами с:
    20 мар 2008
    Сообщения:
    5
    Симпатии:
    0
    Попробовал
    Код (Text):
    1.  
    2. $context = stream_context_create(array('ftp' => array ( 'mode' => 'binary' )));
    3. $handle = file_get_contents($filename, null, $context);
    На виндах выдаёт нормально, на линухе чушь. Как и с фопеном.
    Ну а копи точно так же сохраняет в локальный файл ведь.
     
  18. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Ну хз. По мне так это если не гон, то преувеличение. Посмотреть хотя бы на параметры offset и maxlen: где они и когда были введены. Пахнет кривыми заплатками.

    P.S. Про readfile(), если не изменяет память, такое же писали: мол, лучше всего использовать для чтения больших файлов. А что в итоге? Кирдык серверу.

    Такие пироги.