За последние 24 часа нас посетили 20065 программистов и 1080 роботов. Сейчас ищут 768 программистов ...

Проблема с загрузкой файлов с сервера в IOS и Android

Тема в разделе "PHP для профи", создана пользователем maxdart, 20 сен 2017.

  1. maxdart

    maxdart Новичок

    С нами с:
    20 сен 2017
    Сообщения:
    2
    Симпатии:
    0
    Всем доброго дня!

    Столкнулся со следующей проблемой. Имеется PHP-скрипт, который берет из базы данных файл (BLOB, изображение, либо PDF), и выдает его для загрузки браузеру, предварительно сформировав нужные заголовки. Этот скрипт корректно работает во всех протестированных декстопных браузерах (FF, Chrome, Opera, MSIE), но при попытке загрузить файл на мобильном устройстве, загружается пустое изображение. Такая картина наблюдается, как минимум в Safari на Iphone (IOS 10.3), и Chrome на устройствах с Android 6. Были перепробованы самые различные варианты отправки headers и их комбинации, но пока что, увы, безрезультатно.

    Буду благодарен за советы по формированию заголовков, которые будут корректно восприниматься как декстопными, так и мобильными браузерами.

    Привожу значимый в данной проблеме отрывок скрипта:


    PHP:
    1. $res = $db->getBLOB($_GET['fid']);
    2. $theUA = strtolower($_SERVER['HTTP_USER_AGENT']);
    3. $fileName = $res['name'];
    4. $formatRFC2231 = 'Content-Disposition: attachment; filename*=UTF-8\'\'%s;';
    5. $formatDef = 'Content-Disposition: attachment; filename="%s";';
    6. $format = $formatDef;
    7. if(strpos($theUA,'msie') || strpos($theUA,'chrome')) {
    8.     $fileName = rawurlencode($fileName);
    9. }
    10. if(strpos($theUA,'opera') || strpos($theUA,'firefox')) {
    11.     $fileName = rawurlencode($fileName);
    12.     $format = $formatRFC2231;
    13. }
    14. $contentDisp = sprintf($format, $fileName);
    15. header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    16. header("Pragma: public");
    17. header("Content-type: ".$res['ctype']);
    18. header($contentDisp);
    19. header("Content-Encoding: binary");
    20. header("Content-Description: File Transfer");
    21. header("Content-Transfer-Encoding: binary");
    22. header("Expires: 0");
    23. echo $res['content'];
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.817
    Симпатии:
    735
    Адрес:
    Татарстан
    потому-то нормальные люди в базах картинки и прочую муть не хранят
     
  3. maxdart

    maxdart Новичок

    С нами с:
    20 сен 2017
    Сообщения:
    2
    Симпатии:
    0
    Спасибо за ответ. Но данный момент мы имеем то, что имеем, и проблему как-то надо решать. Был бы еще более благодарен за дельный совет :)