За последние 24 часа нас посетили 36754 программиста и 1711 роботов. Сейчас ищет 1151 программист ...

Отдача файлов с использованиет X-accel

Тема в разделе "Прочие вопросы по PHP", создана пользователем unmanner, 5 сен 2011.

  1. unmanner

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

    С нами с:
    23 янв 2011
    Сообщения:
    105
    Симпатии:
    0
    Всем привет!

    Существует проблема при загрузке файлов в опере с моего сайта. Файлы скачиваются с расширением htm

    Вот список заголовков:
    ------
    HTTP/1.1 200 OK
    Date: Mon, 05 Sep 2011 13:10:38 GMT
    Content-Type: text/html; charset=windows-1251
    Connection: close
    Set-Cookie: PHPSESSID=c7931adebb085db8a3d41f07766a3ed0; path=/
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Content-Disposition: attachment; filename="(forstud.info)_image_072(2).jpg"
    Server: Jino.ru/mod_pizza
    Last-Modified: Wed, 31 Aug 2011 08:39:30 GMT
    ETag: "157c999-c85a0-4abc91111d480"
    Accept-Ranges: bytes
    Content-Length: 820640
    ------

    Вопрос -- какого не хватает? :)
     
  2. unmanner

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

    С нами с:
    23 янв 2011
    Сообщения:
    105
    Симпатии:
    0
    Отдаю файл так :

    ----
    header('X-Accel-Limit-Rate: "2"');
    header('Content-Disposition: attachment; filename="'.$this->properties['new_name'].'"');
    header('X-Accel-Redirect: /'.$this->properties['old_name']);
    ----

    Где Имя с которым нужно отдать и Имя реального файла на сервере выглядят примерно так:
    $this->properties['new_name'] = "(forstud.info)_image_072(2).jpg"
    $this->properties['old_name'] = "uploads/sdS45FDEF77VDvv43"
     
  3. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Content-Type поставить нужный из php
     
  4. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Смущает наличие ETag... nginx его вроде как не отдает, откуда он?
     
  5. unmanner

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

    С нами с:
    23 янв 2011
    Сообщения:
    105
    Симпатии:
    0
    application/octet-stream тип?

    Насчёт Etags не в курсе, этот лог мне прислал хостер :)
     
  6. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Ну попробуй разные... по идее должно рабоать и image/jpeg.
    В общем все так же, как если бы отдавал файл полностью через php.
     
  7. unmanner

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

    С нами с:
    23 янв 2011
    Сообщения:
    105
    Симпатии:
    0
    не не не, файлы разные все, есть zip rar rtf doc тоесть вообще что-угодно может быть, вот с этим - то и проблема....
     
  8. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Если пхп 5.3+ то http://ru.php.net/manual/en/function.finfo-file.php
    Если меньше 5.3, то этот fileinfo как отдельный pecl шел
    Так просто... красивей, что ли. Но, наверно, можно и тупо application/octet-stream на все отдавать попробовать.
     
  9. unmanner

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

    С нами с:
    23 янв 2011
    Сообщения:
    105
    Симпатии:
    0
    Проблема видимо не в этом..... даже со строчкой:

    header("Content-type: image/jpeg");

    Всё равно расширение htm
     
  10. unmanner

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

    С нами с:
    23 янв 2011
    Сообщения:
    105
    Симпатии:
    0
    Проблемы не было когда я перед отдачей переименовывал файл из хэша в надлежащий вид. Но ведь копирование это уж через чур..
     
  11. unmanner

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

    С нами с:
    23 янв 2011
    Сообщения:
    105
    Симпатии:
    0
    Короче, вот функция, с версией = 1 всё работает но я считаю что это неправильный подход.
    С версией 2 в Опере расширение htm у всех файлов...

    PHP:
    1. function download_file()
    2. {
    3. $ver = 1;
    4. #$ver = 2;
    5.  
    6. if ($ver == 1)
    7.     {
    8.     if ( !copy( $this->properties['old_name'], 'uploads/tmp/'.$this->properties["new_name"]))
    9.         {
    10.         SysLogTrace('ERROR','Error while creating TMP file. From: '.$this->properties['old_name'].' To: uploads/tmp/'.$this->properties["new_name"]);
    11.         exit();
    12.         }
    13.  
    14.     header('X-Accel-Limit-Rate: "2"');
    15.     header('Content-Disposition: attachment; filename="'.$this->properties['new_name'].'"');
    16.     header('X-Accel-Redirect: /uploads/tmp/'.$this->properties['new_name']);
    17.  
    18.     #$un_res = unlink('uploads/tmp/'.$this->properties['new_name']);
    19.     #echo $un_res.'<br/>';
    20.     #echo '/uploads/tmp/'.$this->properties['new_name'];
    21.     exit();
    22.     }
    23. else if ($ver == 2)
    24.     {
    25.     header('X-Accel-Limit-Rate: "2"');
    26.     header("Content-type: application/force-download");
    27.     header('Content-Disposition: attachment; filename="'.$this->properties['new_name'].'"');
    28.     header('X-Accel-Redirect: /'.$this->properties['old_name']);
    29.  
    30.     exit();
    31.     }
    32.  
    33. }
     
  12. unmanner

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

    С нами с:
    23 янв 2011
    Сообщения:
    105
    Симпатии:
    0
    Ну так как, будут соображения?
     
  13. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Конкретный URL давай - посмотрю.
    Мне вообще непонятно как в условиях виртуального хостинга работает X-Accel-Redirect. Эта директива дает команду nginx (который, вероятно, как фронт-енд стоит перед апачем) сделать внутренний редирект. Что бы отдался файл - это правило должно быть описано в nginx... а как оно там описано? Никто же не знает.
     
  14. unmanner

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

    С нами с:
    23 янв 2011
    Сообщения:
    105
    Симпатии:
    0
    Проблема вернулась....

    Почему-то опере не нравится расширение *.docx - предлагает скачать его как htm
    Вот ссылка: http://forstud.info/download3.php?name=(forstud.info)_ivlev.docx

    !!! При этом в остальных браузерах(FF,Chrome) и в Opere(кроме проблемы, строкой выше) файлы всех расширений грузятся на ура!

    Отдаю так:

    header('X-Accel-Limit-Rate: "2"');
    header('Content-Disposition: attachment; filename="'.$this->properties['new_name'].'"');
    header('X-Accel-Redirect: /uploads/tmp/'.$this->properties['new_name']);
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    форсед даунлоад не покатит?
     
  16. unmanner

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

    С нами с:
    23 янв 2011
    Сообщения:
    105
    Симпатии:
    0
    Неа...тогда другие браузеры не качают а открывают...
     
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    оч странно. я всегда полагал, что форсед даунлоад как раз вроде как всегда приводит к сохранялке, разве нет? =(