За последние 24 часа нас посетили 16878 программистов и 1291 робот. Сейчас ищут 1532 программиста ...

Получение файла с сервера (не открывается)

Тема в разделе "Вопросы от блондинок", создана пользователем sanches, 24 окт 2006.

  1. sanches

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

    С нами с:
    24 окт 2006
    Сообщения:
    5
    Симпатии:
    0
    Понимаю, что задача распространенная, но я столкнулся с проблемой, которую пока никак не могу разрешить. Необходимо вытаскивать файлик из БД (MSSQL) и отдавать ее пользователю. Вот код, который это делает:
    Код (Text):
    1. function get_file($id)
    2. {
    3.     global $current_conn;
    4.     $sql = "SELECT bpmp_o_data_data, bpmp_o_data_name FROM bpmp_o_data WHERE bpmp_o_data_id=".$id;
    5.     if ($rs = odbc_exec($current_conn,$sql))
    6.     {
    7.         $fa = odbc_fetch_array($rs);
    8.     }
    9.     $data = $fa['bpmp_o_data_data'];
    10.  
    11.     $fsize = strlen($data);
    12.     header("HTTP/1.1 200 OK");
    13.     header("Content-Length: ".($fsize));
    14.  
    15.     $fname = explode(".", $fa['bpmp_o_data_name']);
    16.     $fext = array_pop($fname);
    17.     $fname = implode(".", $fname);
    18.     header('Content-Disposition: attachment; filename="'.$fa['bpmp_o_data_name'].'"');
    19.     switch($fext)
    20.     {
    21.         case "pdf":
    22.             header("Content-type: application/pdf");
    23.             break;
    24.         case "doc":
    25.             header("Content-type: application/msword");
    26.             break;
    27.         case "xls":
    28.             header("Content-type: application/vnd.ms-excel");
    29.             break;
    30.         case "ppt":
    31.             header("Content-type: application/vnd.ms-powerpoint");
    32.             break;
    33.         default:
    34.             header("Content-type: application/octet-stream");
    35.             break;
    36.     }
    37.     echo($data);
    38. }
    При этом, файл отдается пользователю. Открывается окошко с предложением выбора: открыть файл или сохранить его. При сохранении файла на диск все ок, при открытии же запускается необходимая программа (word/excel/winrar и т.д.) и появляется ошибка типа "Невозможно открыть C:\Documents And Settings\...\имя_файла[1].rar". Подскажите что с этим делать?
     
  2. Mavir

    Mavir Guest

    Открыть блокнотом или в Total Commander'e и посмотреть, что на самом деле записано в этом файле.
     
  3. sanches

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

    С нами с:
    24 окт 2006
    Сообщения:
    5
    Симпатии:
    0
    Указанный в сообщении об ошибке путь ведет в папку кэша IE (Temporary Internet Files\Content.IE5\...). Этот файл просто отсутствует в указанной папке. Почему такое может быть?
     
  4. А какие заголовки отдаются браузеру?
     
  5. sanches

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

    С нами с:
    24 окт 2006
    Сообщения:
    5
    Симпатии:
    0
    Как бы это посмотреть? Что-то помню про телнет, но сейчас корректно написать запрос не получилось.
     
  6. Mavir

    Mavir Guest

    Извиняюсь, не правильно понял проблему. Подумал, что файлы не открываются вообще.
    По-моему ничего с этим не поделать. Это броузер сохраняет файл в свой временный каталог и за те секунды (доли секунд) между тем как броузер запустил нужную программу и эта программа начала открывать файл, броузер успевает его удалить :)
    Это предположение. Может еще у кого будут другие мнения.
     
  7. можно и через телнет
    запрос очень простой
    GET /script?params HTTP/1.1
    Host: site.ru
    и лишний перевод строки в конце

    но я бы посоветовал плагин livehttpheaders к мозилле
     
  8. sanches

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

    С нами с:
    24 окт 2006
    Сообщения:
    5
    Симпатии:
    0
    Вот такую инфу удалось получить с помощью сниффера:

    [​IMG]
     
  9. вот эти - cache-control, expires, Pragma - надо убрать.
    из-за них эксплорер не может открыть файл, поскольку его не кэширует.

    сессии используются?
     
  10. sanches

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

    С нами с:
    24 окт 2006
    Сообщения:
    5
    Симпатии:
    0
    Спасибо, товарищь!

    Код (Text):
    1. header('Cache-Control: public');
    Спасло меня.