Скачать файл с сервера PHP

Я хочу загрузить образ сервера с помощью PHP. Характеристики:

  • Я не хочу использовать javascript и не хочу передавать имя по базе данных, а затем извлекать его.
  • Изображение, которое я хочу загрузить, представляет собой QR-код, который я сгенерировал и сохранил в каталоге «php_action / temp». В этом каталоге есть несколько изображений, поэтому я пытаюсь загрузить только созданный мной файл.
  • Я добавил библиотеку phpqrcode и создал файл, который вызывает эту библиотеку для генерации QR-кода. Это файл show_product2.php в корне.

    Я не могу скачать файл.

    //set it to writable location, a place for temp generated PNG files
    
     session_start();
    
    $PNG_TEMP_DIR = dirname(__FILE__).DIRECTORY_SEPARATOR.'php_action'.DIRECTORY_SEPARATOR.'temp'.DIRECTORY_SEPARATOR;
    
    //html PNG location prefix
    $PNG_WEB_DIR = 'temp/';
    
    include "phpqrcode/qrlib.php";
    
    //ofcourse we need rights to create temp dir
    if (!file_exists($PNG_TEMP_DIR))
    mkdir($PNG_TEMP_DIR);
    
    
    $filename = $PNG_TEMP_DIR.'test.png';
    
    //processing form input
    //remember to sanitize user input in real-life solution !!!
    $errorCorrectionLevel = 'L';
    if (isset($_REQUEST['level']) && in_array($_REQUEST['level'], 
    array('L','M','Q','H')))
    $errorCorrectionLevel = $_REQUEST['level'];
    
    $matrixPointSize = 4;
    if (isset($_REQUEST['size']))
    $matrixPointSize = min(max((int)$_REQUEST['size'], 1), 10);
    
    
    if (isset($_REQUEST['data'])) {
    
    //it's very important!
    if (trim($_REQUEST['data']) == '')
    die('Introduzca la Referencia del Producto en el campo "Referencia" 
    y haga clic en "Generar", no puede dejar en blanco los datos! <a 
    href = "?">Regresar</a>');
     $ReferenciaProducto = $_REQUEST['data'];
       // user data
        $filename = $PNG_TEMP_DIR.$ReferenciaProducto.''
            .md5($_REQUEST['data'].'|'
            .$errorCorrectionLevel.'|'.$matrixPointSize).'.png';
             QRcode::png($_REQUEST['data'], $filename, $errorCorrectionLevel, 
         $matrixPointSize, 2);
    
    
    $filename2 = $ReferenciaProducto.'- '.md5($_REQUEST['data']
     .'|'
    .$errorCorrectionLevel.'|'.$matrixPointSize).'.png';
    $_SESSION['filename']=$filename2; 
    
    } else {
    
        //default data
      echo 'La Imagen QR que aparece por defecto, es de prueba, hasta que no 
      introduzca la referncia en el campo inferior y presione "Generar" no 
      se visualizará la imagen definitiva"<hr/>';
      QRcode::png('PHP QR Code :)', $filename, $errorCorrectionLevel, 
       $matrixPointSize, 2);
    
        }
    
           //display generated file
         // echo '<img src = "'.$PNG_WEB_DIR.basename($filename).'" /><hr/>';
         echo '<img 
    
       src = "'.'php_action'.DIRECTORY_SEPARATOR.$PNG_WEB_DIR
     .basename($filename).'" /><hr/>';
    
      //.'php_action'.DIRECTORY_SEPARATOR.
    
      //config form
    echo '<form action = "show_product2.php" method = "post">
    Ref:&nbsp;<input name = "data" value = "'.(isset($_REQUEST['data'])? 
    htmlspecialchars($_REQUEST['data']):'Escriba  Ref.de Producto').'" />&nbsp;
         Definición:&nbsp;<select name = "level">
        <option value = "L"'.(($errorCorrectionLevel=='L')?' selected':'').'>L 
        - Muy Baja</option>
        <option value = "M"'.(($errorCorrectionLevel=='M')?' 
        selected':'').'>Baja</option>
        <option value = "Q"'.(($errorCorrectionLevel=='Q')?' 
         selected':'').'>Media</option>
        <option value = "H"'.(($errorCorrectionLevel=='H')?' 
        selected':'').'>Alta - La Mejor</option>
         </select>&nbsp;
         Tamaño:&nbsp;<select name = "size">';
    
           for($i=1;$i<=10;$i++)
          echo '<option value = "'.$i.'"'.(($matrixPointSize==$i)?' 
           selected':'').'>'.$i.'</option>';
    
         echo '</select>&nbsp;
      **strong text** <input type = "submit" value = "GENERAR"></form><hr/>';
    
    
     ?>
     <center>
    
      <?php echo "<form method='get' action='php_action/downloadQr.php? 
     Descargar='".$_SESSION['filename'].">";?>
    
      echo' <button class = "btn btn-default button3" data-toggle = "submit"
      name = "Descargar" data-target = "Descarga"><i class = "glyphicon glyphicon-
     download-alt"></i> Descargar Qr en su Computadora </button>
    
    &nbsp;<button class = "btn btn-default button3" data-toggle = "submit"
    id = "GuardarQRlBtn" data-target = "#GuardarQRlBtn"> <i class = "glyphicon
    glyphicon-tasks"></i> Guardar Qr en el Servidor </button></form>';
    
    
     </center>
    

Я создал в другом каталоге функцию, которая вызывается для загрузки файла. Эта функция находится в "includes / functions.php". Поскольку в предыдущем коде эта функция вызывается: "includes / functions.php";

      function descargar($fichero){
      $basefichero = basename($fichero);

      $filename = 'php_action/temp'.$basefichero;


         if (!empty($basefichero) && file_exists($basefichero)){
         header('Content-Type: 
         application/vnd.openxmlformats- 
         officedocument.wordprocessingml.document');
         header('Content-Disposition: attachment; 
         filename = "' . $filename .'"');
         header('Expires: 0');
         header('Cache-Control: must-revalidate');
         header('Pragma: public');
         header('Content-Length: ' . sprintf("%u", filesize($filename)));


        // Then:
       flush(); // just in case
       readfile($filename);
       }
        }
         ?>

Когда я вставляю ссылку на продукт и нажимаю «Создать», код работает нормально, потому что QR создает имя, за которым следует случайное расширение, и сохраняет его в моем «временном» каталоге в формате png. Я включил контрольную точку, которая заставляет программу записывать ссылку на изображение на экране, которое сохраняется внутри переменной «$ filename2» в коде, это впечатление создается хорошо, поэтому переменная передается правильно.

Когда однажды создается изображение, которое находится в переменном пути «$ filename» и в имени файла, как я сказал в «$ filename2», и я нажимаю кнопку «Загрузить QR на свой компьютер», программа ищет файл, в котором это инструкции для вызова функции загрузки, которая является файлом (скачать Qr.php):

      <?php
      session_start();
      include "includes/functions.php";

      if (isset($_GET['Descargar'])) {

      echo $_SESSION['filename'];

       descargar($_SESSION['filename']);


        }

       ?>

В качестве метода управления я снова вставляю в этот файл инструкцию "echo $ _SESSION ['filename'];" так что меня впечатлило имя файла, который теперь сохраняется в глобальной переменной «$ _SESSION» уже в предыдущем файле «show_product2.php», который я создал для имени файла изображения «$ filename2». И действительно, в переменную передается имя файла, поэтому пока все хорошо.

Наконец, действие начинает выполнять инструкции, снова печатает в моем "эхо" элементе управления имя файла изображения, это означает, что он получает его, но здесь он останавливается, пустой экран с именем файла остается, но он не скачивает файл. Таким образом, я думаю, что ошибка должна быть в функции "descargar ()", но я не знаю, что это за ошибка. Я описал эту функцию выше. Переменные с именем файла изображения правильно передаются из одного файла в другой и в функцию.

Я ценю любую помощь.

На первый взгляд, у вас есть опечатка: header("Content-Transfer-Encoding: binay"); . Должен быть binary, а не binay.

JonJ 19.11.2018 16:10

HiJonJ, я повторно отредактировал, чтобы написать его правильно, но это не ошибка, потому что я запускаю его снова и снова в той же ситуации. Я столько раз пробовал разные варианты, что по ошибке написал этот параметр.

Óscar 19.11.2018 16:29
Content-Dsiposition также написан неправильно. Не заметил этого раньше.
JonJ 19.11.2018 16:53

перередактировал теперь правильно.

Óscar 19.11.2018 17:19
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
347
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы скачать файл, вот заголовки, которые я нашел работающими. Обратите внимание, что это для документа Word (поскольку это сложный пример для Content-Type):

header('Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document');
header('Content-Disposition: attachment; filename = "' . $filename .'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . sprintf("%u", filesize($filename)));

// Then:

flush(); // just in case
readfile($filename);

Чтобы вывести изображение в браузере, попробуйте:

header("HTTP/1.0 200 OK");
header("Content-Type: image/png"); // Or /jpg, /gif, etc
header("Content-Length: " . (string) filesize($filename));
header("Content-Transfer-Encoding: binary");
header("Content-Disposition: inline");
header("Location: /" . $filename);

// Then:

$fileHandle = fopen($filename, 'rb');
fpassthru($fileHandle);

Приведены разные способы вывода размера файла.

Привет, JonJ. Ваш пример как таковой не работает. Есть ли в вашем примере "$ filename" = "$ fiechero"? а где вы определяете путь к файлу ?. это имя файла (база) $ basefichero = basename ($ fichero); и это "путь" + базовое имя. $ filePath = 'php_action / temp'. $ basefichero;

Óscar 19.11.2018 17:18

При необходимости вам нужно будет заменить имена файлов и пути, я хотел использовать английский для имен переменных. Попробуйте $filename = 'php_action/temp'.$basefichero;.

JonJ 19.11.2018 17:21

Я отредактировал свой вопрос и заменил его вашим кодом для функции descargar (), который кажется более логичным, чем мой предыдущий. Но это все еще не работает,

Óscar 19.11.2018 17:41

Другие вопросы по теме