За последние 24 часа нас посетили 73599 программистов и 10174 робота. Сейчас ищет 2881 программист ...

Отдаём xlsx файл пользователю. А он открывается а не скачивается

Тема в разделе "PHP для новичков", создана пользователем graf_vorontsov, 7 мар 2018.

  1. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    Посмотри заголовки ответа
     
  2. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    Код (Text):
    1. Response Headers
    2. Cache-Control  
    3. post-check=0, pre-check=0
    4. Connection  
    5. keep-alive
    6. Content-Encoding  
    7. gzip
    8. Content-Length  
    9. 3550
    10. Content-Type  
    11. text/html; charset=utf-8
    12. Date  
    13. Sat, 10 Mar 2018 14:50:17 GMT
    14. Expires  
    15. Mon, 1 Jan 2001 00:00:00 GMT
    16. Last-Modified  
    17. Sat, 10 Mar 2018 14:50:17 GMT
    18. P3P  
    19. CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
    20. Pragma  
    21. no-cache
    22. Server  
    23. nginx
    24. Vary  
    25. Accept-Encoding
    --- Добавлено ---
    на всякий случай и вот это ещё
    Код (Text):
    1. Request Headers
    2. Accept  
    3. text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    4. Accept-Encoding  
    5. gzip, deflate
    6. Accept-Language  
    7. ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,uk;q=0.6
     
  3. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    Ну что, по ходу, где-то твои заголовки почему-то перезаписываются, и браузер думает, что ему дали HTML. Теперь надо найти где.
     
  4. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    Вот что даёт, если использую mysql соединение, тут всё чётко.
    Код (Text):
    1. Cache-Control  
    2. must-revalidate
    3. Connection  
    4. keep-alive
    5. Content-Description  
    6. File Transfer
    7. Content-Disposition  
    8. attachment; filename=AvtoPro.xlsx
    9. Content-Length  
    10. 14232
    11. Content-Transfer-Encoding  
    12. binary
    13. Content-Type  
    14. application/octet-stream
    15. Date  
    16. Sat, 10 Mar 2018 17:00:45 GMT
    17. Expires  
    18. 0
    19. Pragma  
    20. public
    21. Server  
    22. nginx
     
  5. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    Ищи ещё причину. mysqli не меняет заголовки ответа, вообще напрямую к ним не относится.
     
  6. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    так, эксперименты продолжаются дальше...
    построил я подключение через PDO.....
    такая же фигня.
    Ну реально меняется только драйвер подключения!!!!

    вот попробуем так. Приведу части кода которые я меняю.
    Это через mysql. Работает идеально!
    PHP:
    1.     mysql_connect($host, $user, $password);
    2.    
    3.     if (!mysql_connect($host, $user, $password)){
    4.         echo "<h2>MySQL Error!</h2>";
    5.         exit;
    6.     }
    7.    
    8.     mysql_select_db($db);
    9.  
    10. $price_a = mysql_query("SELECT DISTINCT `BRAND` ,  `NUMBER` ,  `NAME` ,  `KOLVO` ,  `PRICE_EURO` ,  `jpg`
    11.                            FROM  `price`
    12.                            JOIN  `amortizators` ON  `SIMPLE_NUMBER` =  `search`");                  
    13.     $array = array();
    14.    
    15.     for($i = 0; $row = mysql_fetch_assoc($price_a); $i++){
    16.         $array[$i] = $row;
    17.     }
    Это через PDO. Не работает скачивание файла, он открывается! Но файл создаётся с данными из БД как надо.
    PHP:
    1. $array = array();
    2.     try {
    3.         $dbh = new PDO("mysql:host=$host;dbname=$db",$user,$password);
    4.         $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    5.        
    6.         $sql = "SELECT DISTINCT `BRAND` ,  `NUMBER` ,  `NAME` ,  `KOLVO` ,  `PRICE_EURO` ,  `jpg`
    7.                            FROM  `price`
    8.                            JOIN  `amortizators` ON  `SIMPLE_NUMBER` =  `search`";
    9.        
    10.         $i = 0;
    11.         foreach ($dbh->query($sql) as $row){
    12.             $array[$i] = $row;
    13.             $i++;
    14.         }
    15.         $dbh = null;
    16.     }catch(PDOException $e){
    17.         echo $e->getMessage();
    18.     }
    Это через mysqli. Не работает скачивание файла, он открывается! Но файл создаётся с данными из БД как надо.
    PHP:
    1. $link = mysqli_connect($host, $user, $password, $db);
    2.  
    3.     /* проверка соединения */
    4.     if (mysqli_connect_errno()) {
    5.         printf("Не удалось подключиться: %s\n", mysqli_connect_error());
    6.         exit();
    7.     }
    8.  
    9.     /* изменение набора символов на utf8 */
    10.     if (!mysqli_set_charset($link, "utf8")) {
    11.         printf("Ошибка при загрузке набора символов utf8: %s\n", mysqli_error($link));
    12.     } else {
    13.         //printf("Текущий набор символов: %s\n", mysqli_character_set_name($link));
    14.     }
    15.  
    16. $price_avtopro = "SELECT DISTINCT `BRAND` ,  `NUMBER` ,  `NAME` ,  `KOLVO` ,  `PRICE_EURO` ,  `jpg`
    17.                            FROM  `price`
    18.                            JOIN  `amortizators` ON  `SIMPLE_NUMBER` =  `search`";  
    19.                        
    20. $price_a = $link->query($price_avtopro);
    21.                        
    22. $array = array();
    23.     for($i = 0; $row = $price_a->fetch_assoc(); $i++){
    24.         $array[$i] = $row;
    25.     }
    Может я что-то упускаю?

    Даже пробовал обнулить header - безрезультатно!
    PHP:
    1. header('Content-Type:', true);
     
  7. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    Не знаю, такую задачу я решал миллион раз, а библиотекой mysql не пользовался ни разу в жизни, поскольку она была устаревшей, когда я только начал. Приводите не полные тексты
     
  8. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    Да, я знаю что она устаревшая, но этому коду 8 лет. Вот решил апгрейд провести и столкнулся с проблемой.
    Хорошо, чуть позже напишу полностью код файлов, которые участвуют в исполнении
     
  9. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    С этого файла я нажимаю на ссылку и дальше идёт переход на файл формирования файла

    PHP:
    1.     header('Content-type: text/html; charset=utf-8');
    2.     echo '<link rel="stylesheet" type="text/css" href="css/main.css" />';
    3.     echo '<script src="js/scripts.js"></script>';
    4.     date_default_timezone_set ( 'Europe/Kiev' ); //установка временной зоны
    5.     require_once "db/connect_db_load_mysqli.php"; //Подключаем БД
    6.     require_once "functions.php"; //Подключаем файл функций  
    7.  
    8. <a href="download_test.php?test=KONI.xlsx"><img src="img/test.jpg"></a>
    Это коннектор к БД
    PHP:
    1. $link = mysqli_connect($host, $user, $password, $db);
    2.      /* проверка соединения */
    3.     if (mysqli_connect_errno()) {
    4.         printf("Не удалось подключиться: %s\n", mysqli_connect_error());
    5.         exit();
    6.     }
    7.  
    8.     /* изменение набора символов на utf8 */
    9.     if (!mysqli_set_charset($link, "utf8")) {
    10.         printf("Ошибка при загрузке набора символов utf8: %s\n", mysqli_error($link));
    11.     } else {
    12.         //printf("Текущий набор символов: %s\n", mysqli_character_set_name($link));
    13.     }
    В этом файле идёт формирование xlsx файла
    PHP:
    1. header('Content-Type:', true);
    2.     require_once "db/connect_db_load_mysqli.php"; //Подключаем БД
    3.     //require_once "db/connect_db_load_pdo.php"; //Подключаем БД
    4.     require_once 'PHPExcel.php';
    5.     //require_once "functions.php"; //Подключаем файл с функциями
    6.  
    7.     setlocale(LC_ALL, 'ru_RU');
    8.     /*получение наценки*/                                                                                                                  
    9.     //$margin = margin('specopt');
    10.  
    11.     $price_avtopro = "SELECT DISTINCT `BRAND` ,  `NUMBER` ,  `NAME` ,  `KOLVO` ,  `PRICE_EURO` ,  `jpg`
    12.                            FROM  `price`
    13.                            JOIN  `amortizators` ON  `SIMPLE_NUMBER` =  `search`";  
    14.                      
    15. $price_a = $link->query($price_avtopro);
    16.                      
    17. $array = array();
    18.     for($lichnik = 0; $row = $price_a->fetch_assoc(); $lichnik++){
    19.         $array[$lichnik] = $row;
    20.     }
    21.                          
    22.     $priceFromDB = $array;
    23.     $catList = $priceFromDB;
    24.  
    25.     echo "<pre>";
    26.     print_r($catList);
    27.     echo "</pre>";
    28.  
    29.     $inputFileName = 'template/template.xlsx'; //загружаем шаблон
    30.     $document = PHPExcel_IOFactory::load($inputFileName);
    31.     $sheet = $document->setActiveSheetIndex(0); // Выбираем первый лист в документе
    32.  
    33.     $first_string = 9; //начальная строка вставки данных
    34.     $sheet->setCellValue('A'.$first_string, 'Производитель');
    35.     $sheet->setCellValue('B'.$first_string, 'Артикул');
    36.     $sheet->setCellValue('C'.$first_string, 'Товар');
    37.     $sheet->setCellValue('D'.$first_string, 'Спецдилерская цена за шт.');
    38.     $sheet->setCellValue('E'.$first_string, 'Кол-во в наличии');
    39.  
    40.     $sheet->getStyle('A9:E9')->getFont()->setName('Arial');
    41.     $sheet->getStyle('A9:E9')->getFont()->setSize(10);
    42.  
    43.     $sheet->getStyle('A9:E9')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID); //заливка шапки таблицы
    44.     $sheet->getStyle('A9:E9')->getFill()->getStartColor()->setRGB('aed2a9'); //цвет ячеек в шапке таблицы
    45.     $sheet->getStyle('A9:E9')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); //выравнивание по горизонтали
    46.     $sheet->getStyle('A9:E9')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); //выравнивание по вертикали
    47.  
    48.     $sheet->getStyle('D9:E9')->getAlignment()->setWrapText(true); //перенос текста
    49.  
    50.     $i = 10; //начальная строка вставки данных
    51.  
    52.     foreach ($catList as $catItem) {
    53.         $proc = 10; // количество процентов наценки для S-Car
    54.         //$proc = $margin; // количество процентов наценки для S-Car
    55.         $number = $catItem['PRICE_EURO']; // число к которому надо добавить проценты
    56.         $proc = $number/100*$proc; // высчитываем процент от числа
    57.         $result = $number + $proc; // суммируем число с процентами от этого числа
    58.      
    59.         $sheet->setCellValue('A'.$i, 'Амортизатор KONI');
    60.         $sheet->setCellValue('B'.$i, $catItem['NUMBER']);
    61.         $sheet->setCellValue('C'.$i, $catItem['NAME']);
    62.         $sheet->setCellValueExplicit('D'.$i, round($result, 2),PHPExcel_Cell_DataType::TYPE_STRING);
    63.         $sheet->setCellValue('E'.$i, '2');
    64.         $sheet->getStyle('D'.$i.':E'.$i)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
    65.         $sheet->getStyle('D'.$i.':E'.$i)->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
    66.         $sheet->getStyle('C'.$i)->getAlignment()->setWrapText(true);
    67.         $i++;
    68.     }
    69.  
    70.     $sheet->getStyle('A9:E'.--$i)->getBorders()->getAllBorders()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN); //рамка
    71.  
    72.     $objWriter = PHPExcel_IOFactory::createWriter($document, 'Excel2007');
    73.     $objWriter->save("KONI.xlsx");
    74.     //$objWriter->save("ТЕСТ прайс KONI.xlsx");
    75.  
    76.     $file = $_GET['test'];
    77.  
    78.     if (ob_get_level()) {
    79.         ob_end_clean();
    80.     }
    81.  
    82.  
    83.     header('Content-Description: File Transfer');
    84.     header('Content-Type: application/octet-stream');
    85. //header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    86.     header('Content-Disposition: attachment; filename=' . basename($file));
    87.     header('Content-Transfer-Encoding: binary');
    88.     header('Expires: 0');
    89.     header('Cache-Control: must-revalidate');
    90.     header('Pragma: public');
    91.     header('Content-Length: ' . filesize($file));
    92.     readfile($file);
    93.     exit;
     
    #34 graf_vorontsov, 11 мар 2018
    Последнее редактирование: 11 мар 2018
  10. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    Версия MySQL: 5.5.59-0+deb7u1
    Версия PHP: 5.3.3-7+squeeze29
     
  11. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    А это что за хрень?
     
  12. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    509
    Симпатии:
    40
    Эта функция не конвертирует, а сообщает кодировку.
     
  13. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    ой, это я проверял, с бд соединение вообще есть или нет, что-то вытягивается оттуда или не
     
  14. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    Дайте ещё варианты что попробовать
     
  15. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    люди..... неужели варианты закончились
     
  16. gruth

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

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    f12 жми и смотри что отдается браузеру заголовками
     
  17. graf_vorontsov

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

    С нами с:
    12 фев 2011
    Сообщения:
    183
    Симпатии:
    1
    Адрес:
    Украина, Харьков
    так я уже в теме писал что оно отдаёт. - ничего нового