Download via header()

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Download via header()

    HiHo,

    habe da "mal wieder" ein Problem mit einem Code

    PHP-Quellcode

    1. $filename = $row->filename;
    2. // header("Content-Disposition: attachment; filename=\"$filename\""); // Dateiname
    3. // header("Content-Length: ".filesize($filename)); // Dateigröße
    4. // header("Content-Type: application/x-gzip"); // MIME-Typ
    5. header('Content-Description: File Transfer');
    6. header('Content-Type: application/x-gzip');
    7. header('Content-Disposition: attachment; filename="'.basename($filename).'"'); //<<< Note the " " surrounding the file name
    8. header('Content-Transfer-Encoding: binary');
    9. header('Connection: Keep-Alive');
    10. header('Expires: 0');
    11. header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    12. header('Pragma: public');
    13. header('Content-Length: ' . filesize('files/'.$filename));
    14. readfile('files/'.$filename); // Ausgabe
    Alles anzeigen


    die Ausgangsdatei liegt ist files. Der Name der Datei steckt in $filename (tar.gz File)
    Er läd die Datei herunter, hat den Richtigen Namen und die richtige Größe aber das herunter geladenen Archiv ist Defekt.
    Wo steckt der Fehler in meinem Code?

    Edit: Easy
  • Das Archiv wird ja nicht erstellt. Das ist bereits vorhanden und liegt auf dem Server.
    Es soll beim Klick lediglich nur herunter geladen werden.

    Der Link download.php?page=download&dl_id=26 greift dann bei Zeile 93

    PHP-Quellcode

    1. class Download {
    2. /**
    3. * Download Link
    4. *
    5. * @access public
    6. * @return int
    7. * @param $id ID
    8. *
    9. */
    10. public function dl_link($id) {
    11. global $Core, $Smarty, $lang;
    12. /*
    13. * Filename auslesen
    14. */
    15. $pdoparams = array(
    16. 'id' => (int) $id
    17. );
    18. $sql = 'SELECT * FROM ' . DOWNLOAD . ' WHERE id = :id ';
    19. $stmt = MyDB::getInstance()->prepare($sql);
    20. $stmt->execute($pdoparams);
    21. $row = $stmt->fetch(PDO::FETCH_OBJ);
    22. $filename = $row->filename;
    23. // header("Content-Disposition: attachment; filename=\"$filename\""); // Dateiname
    24. // header("Content-Length: ".filesize($filename)); // Dateigröße
    25. // header("Content-Type: application/x-gzip"); // MIME-Typ
    26. header('Content-Description: File Transfer');
    27. header('Content-Type: application/x-gzip');
    28. header('Content-Disposition: attachment; filename="'.basename($filename).'"'); //<<< Note the " " surrounding the file name
    29. header('Content-Transfer-Encoding: binary');
    30. header('Connection: Keep-Alive');
    31. header('Expires: 0');
    32. header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    33. header('Pragma: public');
    34. header('Content-Length: ' . filesize('files/'.$filename));
    35. readfile('files/'.$filename); // Ausgabe
    36. }
    37. /**
    38. * download
    39. *
    40. * @access public
    41. * @return String
    42. *
    43. */
    44. public function download() {
    45. global $Core, $Smarty, $lang;
    46. $download = array();
    47. /*
    48. * Kategorie auslesen
    49. */
    50. $pdoparams = array(
    51. ':cat_id' => (int) 9
    52. );
    53. $sql = 'SELECT * FROM ' . DOWNLOAD_CAT . ' WHERE cat_id = :cat_id ';
    54. $stmt = MyDB::getInstance()->prepare($sql);
    55. $stmt->execute($pdoparams);
    56. $cat_row = $stmt->fetch(PDO::FETCH_OBJ);
    57. /*
    58. * Downloads auslesen
    59. */
    60. $sql = 'SELECT * FROM ' . DOWNLOAD . ' WHERE cat_id = :cat_id ';
    61. $stmt = MyDB::getInstance()->prepare($sql);
    62. $stmt->execute($pdoparams);
    63. while ($row = $stmt->fetch()) {
    64. $row['created_time'] = $Core->userdate($row['created_time']);
    65. $row['description'] = nl2br($row['description']);
    66. /*
    67. * Anhänge?
    68. */
    69. if ( $row['thumbnails'] ) {
    70. $attChunks = explode(";", $row['thumbnails']);
    71. for($i = 0; $i < count($attChunks); $i++){
    72. $row['att'] .= ' <img src="'.PATH.'images/'.$attChunks[$i].'" weight="100" height="100" />';
    73. }
    74. }
    75. $download[] = $row;
    76. }
    77. // Ausgabe Header
    78. $Core->page_header($cat_row->cat_name);
    79. // Link angeklickt?
    80. if ($Core->get(GET, 'dl_id', true)) {
    81. $this->dl_link($Core->get(GET, 'dl_id'));
    82. }
    83. $Smarty->assign(array(
    84. 'DOWNLOAD' => $download,
    85. 'CAT_NAME' => $cat_row->cat_name,
    86. 'CAT_DESC' => $cat_row->cat_desc,
    87. ));
    88. $Smarty->display('download.htm');
    89. }
    90. }
    Alles anzeigen
  • Moin,

    das Problem scheint bei Zeile 89 zu sein

    PHP-Quellcode

    1. // Ausgabe Header
    2. $Core->page_header($cat_row->cat_name);


    Setzte ich das unter die if Abfrage in Zeile 95, so ist das herunter geladene Archiv nicht mehr Defekt und lässt sich auch Entpacken.Ist ja auch klar. page_header() hat folgenden Inhalt

    PHP-Quellcode

    1. /**
    2. * Ausgabe des Header
    3. *
    4. * @param $page_title String Titel der Aufgerufenen Seite
    5. * @return mixed
    6. * @access public
    7. */
    8. public function page_header($page_title) {
    9. global $Smarty, $lang;
    10. $Smarty->assign(array(
    11. 'PAGE_TITLE' => $page_title . ' &bull; ' . self::get_config('page_title'),
    12. 'PAGE_DESC' => self::get_config('page_desc'),
    13. 'LANG' => $lang,
    14. ));
    15. $Smarty->display('page_header.htm');
    16. }
    Alles anzeigen


    Ganz klar Anfängerfehler :whistling: vor header() darf keine Ausgabe erfolgen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Grommel ()