从Server PHP

时间:2018-11-19 14:17:59

标签: php image server downloadfile

我想使用PHP下载服务器映像。规格:

  • 我不想使用javascript,也不想通过数据库传递名称然后检索它。
  • 我要下载的图像是我生成并保存在“ php_action / temp”目录中的QR码。在此目录中,有几张图像,因此我尝试仅下载生成的文件。
  • 我添加了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);
       }
        }
         ?>

当我插入产品参考并按“ Generate”时,代码可以正常工作,因为QR会创建一个名称,后跟一个随机扩展名,并将其以png格式保存在我的“ temp”目录中。我已包含一个控制点,该控制点强制程序将屏幕上的图像引用写入代码中保存在变量“ $ 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'];”。这样,我为图像文件“ $ filename2”的名称创建的上一个文件“ show_product2.php”中已经保存在全局变量“ $ _SESSION”中的文件的名称给我留下了深刻的印象。的确,到目前为止,文件名确实是在变量中接收的。

最后,操作开始按照说明进行,在我的“ echo”控件中再次打印图像文件的名称,这意味着它已接收到图像文件,但是在此停止,带有文件名的空白屏幕是左,但它不会下载文件。因此,我认为,通过推论,该错误必须在函数“ descargar()”中,但我不知道它失败了。我已经在上面描述了此功能。具有图像文件名的变量可以正确地从一个文件传递到另一个文件,然后传递给函数。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

要下载文件,以下是我发现有效的标题。请注意,这是针对Word文档的(因为这是xtabs(as.integer(amount) ~ airport.arrival + airport.departure, df) 的复杂示例):

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);

给出了输出文件大小的不同方法。