изображение — скачать файл с переполнения стека сервера

Я хотел бы скачать образ сервера с помощью 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 создает имя, за которым следует произвольное расширение, и сохраняет его в моем каталоге «temp» в формате png. Я включил контрольную точку, которая заставляет программу писать ссылку на изображение на экране, которое сохраняется в переменной «$ filename2» в коде, это впечатление создается хорошо, поэтому переменная передается правильно.

Когда однажды генерируется изображение, которое находится в переменной пути «$ filename» и в имени файла, как я сказал в «$ filename2», и я нажимаю кнопку «Скачать QR на вашем компьютере», программа ищет файл, где инструкции по вызову функции загрузки файла (DownloadQr.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 ()», но я не знаю, что она дает сбой. Я описал эту функцию выше. Переменные с именем файла изображения правильно передаются из одного файла в другой и в функцию.

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

0

Решение

Чтобы скачать файл, вот заголовки, которые я нашел. Обратите внимание, что это для документа 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);

Для разных способов вывода дан размер файла.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]