За последние 24 часа нас посетил 7981 программист и 959 роботов. Сейчас ищут 513 программистов ...

Возвращается битый exel файл

Тема в разделе "Прочие вопросы по PHP", создана пользователем nego, 7 сен 2010.

  1. nego

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

    С нами с:
    5 фев 2008
    Сообщения:
    14
    Симпатии:
    0
    Здравствуйте!
    Возникла след. проблема при upload excel файла, файл возвращается битый, а точнее в начале файла добавляется лишний байт 0A. Из-за этого excel орет, что файл поврежден.
    Примерный код приведен ниже:

    header("Expires: 0");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Cache-Control: no-store, no-cache, must-revalidate");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");
    header("Content-type: application/x-excel");
    header('Content-Disposition: inline; filename="'.$fileName.'"');
    $fileTmp = 'd:/'.$fileName;
    $handle = fopen($fileTmp, "rb");
    $contents = fread($handle, filesize($fileTmp));
    fclose($handle);
    //header("Content-Length: ".filesize($fileTmp));
    echo $contents;

    Я так думаю, что тут апач чего то начинает подменять, но это только мои предположения
     
  2. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    попробуй функцию readfile($fileTmp) или file_get_contents($fileTmp)
    как пользоваться можно почитать в мануале
     
  3. nego

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

    С нами с:
    5 фев 2008
    Сообщения:
    14
    Симпатии:
    0
    Проблема не в чтении файла, а в самой передаче данных браузеру.
    Дело в том, что это только пример. На самом деле, файл мне приходит потоком с другого сервера и я его перенаправляю уже в браузер. До этого я думал, что ко мне приходил битый файл уже в потоке, но когда я его сохранил сразу на диск, то файл был правильным и открывался без проблем. Кстати, почему то картинки и пдф файлы передаются нормально, а вот excel подвел. Вот я и думаю, то ли в хеадере нужно что то прописать еще, или нужно апач ковырять.
     
  4. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    я делаю так:
    PHP:
    1.  
    2. <?php
    3.  
    4. function get_content_type($type = ''){
    5.   $types = array(
    6.     'css' => "text/css",
    7.     'htm' => "text/html",
    8.     'html'=> "text/html",
    9.     'js'  => "text/js",
    10.     'xml' => "text/xml"
    11.   );
    12.  
    13.   if(isset($types[$type])){
    14.     return $types[$type];
    15.   } else {
    16.     return "application/octet-stream";
    17.   }
    18. }
    19.  
    20. $path = 'path_to_your_file';
    21.  
    22. $file = pathinfo($path);  // dirname, basename, filename, extension
    23. $file['path'] = $path;
    24.  
    25. $content_type = get_content_type($file['extension']);
    26. header("Content-Type: {$content_type}");
    27. readfile($file['path']);
    28. exit();
    29. ?>
    30.  
     
  5. asik

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

    С нами с:
    12 июл 2007
    Сообщения:
    211
    Симпатии:
    0
    у меня так:
    PHP:
    1. <?php
    2. $fileName = '1.xls';
    3. $dir='c:\\';
    4. header('Content-Disposition: inline; filename="'.$fileName.'"');
    5. header("Content-type: application/x-excel");
    6. include($dir.$fileName);
    7. ?>