Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Content Type / readfile / 1-Klick-Download

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Content Type / readfile / 1-Klick-Download

    Hallo liebe Gemeinde,

    ich möchte gerne einen geschützten Download - Bereich anbieten. Das heißt, die Links dürfen nicht sichtbar sein. Nach einigen Recherchen ist mir dieses Script ziemlich hilfreich gewesen:

    PHP: readfile - Manual

    Funktioniert auch gut. Jedoch ist jetzt das Problem, dass die Rar Dateien beim Download beschädigt und nicht geöffnet werden können. Bilder funktionieren.
    Muss anscheinend was mit MIME Types zu tun haben? Doch wie nutze ich die richtig? Hat jemand da eine Idee?

    PHP-Code:
    <?php
    session_cache_limiter
    ('none');
    session_start();

    if (
    $_GET["id"]) {
        
    _Download("dateien/"$_GET["id"]);
    }

    function 
    _Download($f_location$f_name){
        
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        
    header('Content-Description: File Transfer');
        
    header('Content-Type: application/octet-stream');
        
    header('Content-Length: ' filesize($f_location));
        
    header('Content-Disposition: attachment; filename=' basename($f_name));
        
    readfile($f_location);
    }

    //if ($_SESSION["user"]) {
        
    if ($handle opendir('dateien/')) {
            while (
    false !== ($file readdir($handle))) {
                if (
    $file != "." && $file != "..") {            
                    echo 
    "<a href='?id=".$file."'>".$file."</a><br />";
                }
            }
            
    closedir($handle);
        }
    //}
    ?>

  • #2
    Bild-darstellung ist etwas tolleranter, mach doch mal nen wirklichen Vergleich der Daten (z.b. md5/sha1-hash) der datei auf dem server mit dem was du nach dem download hast, z.b. kann schon ein line-break hinter dem ?> das ganze verändern.

    Wenn die hash-werte nicht gleich sind nimm dir nen text oder hex-editor und vergleiche die Dateien mal und schau wo der unterschied ist, ob am anfang oder ende der Datei was zusätzlich steht (spaces, line-breaks, ne fehlermeldung ? )

    Kommentar


    • #3
      Ich hab mal so ein Script geschrieben und mal für dich umgemünzt:

      PHP-Code:
      <?php
      header
      ("HTTP/1.0 200 Ok"true);
      header("Status: 200 Ok"true);
      header("Cache-Control: "true);
      header("Expires: "true);
      header("Pragma: "true);
      header("Content-Type: application/octet-stream"true);
      header("Accept-Ranges: bytes"true);
      header("Last-Modified: " gmdate("D, d M Y H:i:s") . " GMT"true);
      header("ETag: \"".md5_file($f_location)."\""true);
       
      if(!isset(
      $_SERVER["HTTP_USER_AGENT"]))
          
      $_SERVER["HTTP_USER_AGENT"] = "";

      $disposition "";
      if(!
      strpos($_SERVER["HTTP_USER_AGENT"],"MSIE 5.5"))
          
      $disposition "attachment; ";
      header("Content-Disposition: ".$disposition."filename=\"" basename($f_location). "\""true);
       
      if(!
      headers_sent())
          
      flush();

      readfile($f_location); 
      ?>

      Kommentar


      • #4
        Vielen Dank für die schnellen Antworten.
        Leider bringt es mich da auch nicht viel weiter.
        Hab den Code implementiert:

        PHP-Code:
        <?php
        if ($_GET["id"]) {
            
        _Download("dateien/"$_GET["id"]);
        }

        function 
        _Download($f_location$f_name) {
            
        header("HTTP/1.0 200 Ok"true);
            
        header("Status: 200 Ok"true);
            
        header("Cache-Control: "true);
            
        header("Expires: "true);
            
        header("Pragma: "true);
            
        header("Content-Type: application/octet-stream"true);
            
        header("Accept-Ranges: bytes"true);
            
        header("Last-Modified: " gmdate("D, d M Y H:i:s") . " GMT"true);
            
        header("ETag: \"".md5_file($f_location)."\""true);
             
            if(!isset(
        $_SERVER["HTTP_USER_AGENT"]))
                    
        $_SERVER["HTTP_USER_AGENT"] = "";
            
            
        $disposition "";
            if(!
        strpos($_SERVER["HTTP_USER_AGENT"],"MSIE 5.5"))
                    
        $disposition "attachment; ";
            
        header("Content-Disposition: ".$disposition."filename=\"" basename($f_location). "\""true);
             
            if(!
        headers_sent())
                    
        flush();
            
            
        readfile($f_location); 
        }

        //if ($_SESSION["user"]) {
            
        if ($handle opendir('dateien/')) {
                while (
        false !== ($file readdir($handle))) {
                    if (
        $file != "." && $file != "..") {            
                        echo 
        "<a href='?id=".$file."'>".$file."</a><br />";
                    }
                }
                
        closedir($handle);
            }
        //}
        ?>
        Jetzt bietet das Script die SELF-Datei an, runterzuladen. Anscheinend passt der Pfad noch nicht.

        Was ich auch nicht verstehe: Die Variable $f_location (rel. Pfad) wird innerhalb der Funktion weiterverwendet. Der Dateiname allerdings nicht?

        Vielen Dank schon mal.

        Kommentar


        • #5
          Das Problem ist gelöst. Vielen Dank. Anbei der Code:

          PHP-Code:
          <?php
          if ($_GET["id"]) {
              
          $dir "dateien/".$_GET["id"]."";
              
              
          header('Content-Type: '.$mime_type);
              
          header('Content-Disposition: attachment; filename='.basename($dir));
              echo 
          file_get_contents($dir);
          }

          //if ($_SESSION["user"]) {
              
          if ($handle opendir('dateien/')) {
                  while (
          false !== ($file readdir($handle))) {
                      if (
          $file != "." && $file != "..") {            
                          echo 
          "<a href='?id=".($file)."'>".$file."</a><br />";
                      }
                  }
                  
          closedir($handle);
              }
          //}
          ?>

          Kommentar


          • #6
            Je nach Größe der Datei kann das Problematisch werden, file_get_contents liest die datei komplett in den Speicher, sprich abhängig von deinem memory_limit (bei hostern oft zwischen 8 und 16mb) kackt das script vielleicht ab.

            Kommentar

            Lädt...
            X