Dateien sind beschädigt!

  • Dateien sind beschädigt!

    Anzeige
    Hey Leute,

    aktuell versuche ich einen Fileuploader mit einer Download Funktion zu programmieren. Alles hat so weit so gut geklappt, nur die Downloadfunktion bereitet mir kummer. Sobald ich eine Datei downloade ist diese immer beschädigt, egal bei welchem Datentyp. Ebenfalls entspricht der Dateigröße nicht der originalen Dateigröße. Kann mir jemand helfen?

    Pastebin - Upload Class

    PHP-Quellcode

    1. <?php
    2. include('Connection.php');
    3. class Upload
    4. {
    5. public function getUpload($filename, $filesize, $filetype, $tmp)
    6. {
    7. // special keywords replace with ""
    8. $filename = preg_replace("/[^a-zA-Z0-9.]/", "", $filename);
    9. // possible max rand number
    10. $maxuid = getrandmax();
    11. $uid = rand(0, $maxuid);
    12. // check all types of files that are allowed
    13. $allowed_extensions = array(
    14. 'mp3', 'mp4', 'doc', 'zip', 'rar',
    15. 'docx', 'ppt', 'pps', 'pptx', 'txt',
    16. 'png', 'jpg', 'jpeg', 'gif', 'pdf', 'exe',
    17. 'php', 'htm', 'html', 'dll', 'aup'
    18. );
    19. // special keywords that need a transformation
    20. $extra_extensions = array(
    21. 'php'
    22. );
    23. $error_report = array(
    24. 'notallowed' => "You can't upload this file type!",
    25. 'filesize' => "Your file is to big to upload. You can only upload max 1GB!"
    26. );
    27. // check if filetype is not in array
    28. if (!in_array(pathinfo($filename, PATHINFO_EXTENSION), $allowed_extensions)) {
    29. echo '<div class="errormessage"><h4>' . $error_report['notallowed'] . '</h4></div>';
    30. return false;
    31. } elseif ($filesize > 500000) {
    32. echo '<div class="errormessage">' . $error_report['filesize'] . '</div>';
    33. return false;
    34. } else {
    35. // Asking if filename have .php
    36. if (in_array(pathinfo($filename, PATHINFO_EXTENSION), $extra_extensions)) {
    37. // change the file ending from .php to .txt - new value to $filename
    38. $info = pathinfo($filename);
    39. $filename = $info['filename'] . '.txt';
    40. // create automaticly a folder with a random uid
    41. $createfolder = mkdir('./files/' . $uid);
    42. // movedir get the new full target with the created uid from createfolder
    43. $movedir = './files/'. $uid . '/';
    44. // give new filename a new basename to upload correctly
    45. $phptargetdir = $movedir . basename($filename);
    46. // move tmp path to targetdir var
    47. move_uploaded_file($tmp, $phptargetdir);
    48. Connection::DB()->query("INSERT INTO files (filename, uid) VALUES ('$filename', '$uid')");
    49. header('Location: download.php?id='. $uid . '&file=' . $filename);
    50. } else {
    51. $createfolder = mkdir('./files/' . $uid);
    52. $movedir = './files/'. $uid . '/';
    53. $targetdir = $movedir . basename($filename);
    54. // move tmp path to targetdir var
    55. move_uploaded_file($tmp, $targetdir);
    56. Connection::DB()->query("INSERT INTO files (filename, uid) VALUES ('$filename', '$uid')");
    57. header('Location: download.php?id='. $uid . '&file=' . $filename);
    58. }
    59. }
    60. }
    61. }
    Alles anzeigen





    Pastebin - Download Class

    PHP-Quellcode

    1. <?php
    2. include('Connection.php');
    3. class DownloadClass
    4. {
    5. public function __construct()
    6. {
    7. if (isset($_GET['id'], $_GET['file'])) {
    8. $query = Connection::DB()->query("SELECT filename, uid FROM files WHERE uid = '" . Connection::DB()->real_escape_string($_GET['id']) . "' AND filename = '". Connection::DB()->real_escape_string($_GET['file']) ."'");
    9. $fquery = $query->fetch_object();
    10. if ($_GET['id'] == $fquery->uid AND $_GET['file'] == $fquery->filename) {
    11. return $this->Download($_GET['id'], $_GET['file']);
    12. } else {
    13. return exit;
    14. }
    15. } else {
    16. Header('Location: index.php');
    17. }
    18. }
    19. public function Download($fileid, $file)
    20. {
    21. $filedir = 'files/' . $fileid . '/' . $file;
    22. $basename = basename($filedir);
    23. header('Content-Description: File Transfer');
    24. header('Content-Type: application/octet-stream');
    25. header('Content-Disposition: attachment; filename="' . $basename . '"');
    26. header('Content-Transfer-Encoding: binary');
    27. header('Connection: Keep-Alive');
    28. header('Expires: 0');
    29. header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    30. header('Pragma: public');
    31. set_time_limit(0);
    32. readfile($file);
    33. }
    34. }
    Alles anzeigen




    Mit besten grüßen!
    Schau doch mal bei mir vorbei:
    twitch.tv/PandshanDE
  • Die Dateien die du bekommst wenn du downloaden tust, wie sehen die denn vom Inhalt aus? Schon mal mit einem Hexeditor nachgeschaut? Vllt. nimmt er völlig falsche Infos und verarbeitet sie in eines deiner Zieldateien.

    Weil irgendwas scheint er ja zu schreiben und das musst du versuchen zu prüfen was das eigentlich ist und woher er das nimmt.
  • Sagaras schrieb:

    Die Dateien die du bekommst wenn du downloaden tust, wie sehen die denn vom Inhalt aus? Schon mal mit einem Hexeditor nachgeschaut? Vllt. nimmt er völlig falsche Infos und verarbeitet sie in eines deiner Zieldateien.

    Weil irgendwas scheint er ja zu schreiben und das musst du versuchen zu prüfen was das eigentlich ist und woher er das nimmt.
    Was genau meinst du vom Inhalt? Ich lade z.B entweder ein rar archive hoch ( 1 Ordner, 1 Exe, 2 Inis ) oder eine png ( avatargröße ). Das Rar archive ist beschädigt und die png konnte nicht geöffnet werden.

    Ich weiß leider gar nicht was ein Hexeditor ist. Ich hab die gedownloadete Datei mal hochgeladen und hab das hier bekommen:


    Die Error-Meldung ist zwar eindeutig, aber ich weiß nicht wie ich sie beheben kann. Verlinkungen sind alle richtig. Wenn ich readfile entferne steht dort "...", löst das Problem aber nicht :/
    Schau doch mal bei mir vorbei:
    twitch.tv/PandshanDE
  • dragon99 schrieb:

    Ich lade z.B entweder ein rar archive hoch ( 1 Ordner, 1 Exe, 2 Inis ) oder eine png ( avatargröße ). Das Rar archive ist beschädigt und die png konnte nicht geöffnet werden.
    Korrekt, weil es dir statt den Dateiinhalt die Fehlermeldung reingeschrieben hat.

    dragon99 schrieb:

    Die Error-Meldung ist zwar eindeutig, aber ich weiß nicht wie ich sie beheben kann. Verlinkungen sind alle richtig.
    Sind sie nicht. readfile liest die Datei und schickt deren Inhalt an den Nutzer, wie es in der Dokumentation auch steht. Und diese Funktion muss wissen, wo die Datei liegt. Du übergibst da lediglich $file, das wird aber nur der Dateiname sein. Vermutlich geht's, wenn du statt $file die Variable $filedir als Parameter benutzt.

    EDIT: Oh, und nebenbei ... nimm Prepared Statements bei den SQL-Anfragen.

    MfG
    Videoempfehlungen:
    ShimmyMC
    NuRap
    ShimmyMC
    Napoleon Bonaparte
  • Anzeige

    RealLiVe schrieb:

    dragon99 schrieb:

    Ich lade z.B entweder ein rar archive hoch ( 1 Ordner, 1 Exe, 2 Inis ) oder eine png ( avatargröße ). Das Rar archive ist beschädigt und die png konnte nicht geöffnet werden.
    Korrekt, weil es dir statt den Dateiinhalt die Fehlermeldung reingeschrieben hat.

    dragon99 schrieb:

    Die Error-Meldung ist zwar eindeutig, aber ich weiß nicht wie ich sie beheben kann. Verlinkungen sind alle richtig.
    Sind sie nicht. readfile liest die Datei und schickt deren Inhalt an den Nutzer, wie es in der Dokumentation auch steht. Und diese Funktion muss wissen, wo die Datei liegt. Du übergibst da lediglich $file, das wird aber nur der Dateiname sein. Vermutlich geht's, wenn du statt $file die Variable $filedir als Parameter benutzt.
    EDIT: Oh, und nebenbei ... nimm Prepared Statements bei den SQL-Anfragen.

    MfG
    Richtig, habe das Problem vor wenigen Minuten gelöst. Ich hätte schwören können, dass ich das schon ausprobiert habe... komisch... xD

    Problem ist jedenfall gelöst und danke für eure Hilfe :)
    Schau doch mal bei mir vorbei:
    twitch.tv/PandshanDE
  • dragon99 schrieb:

    Ich weiß leider gar nicht was ein Hexeditor ist.
    Etwas traurig das als Programmierer nicht zu wissen was das ist. Hat mich etwas überrascht als du das geschrieben hast ^^

    Ein Hex-Editor ist des Programmierers bester Freund und Helfer. ^^

    Damit kann man schon einiges machen. Immer gut sowas zur Hand zu haben. ^^ Gerade wenn es um Files geht die du schreiben lässt. Man weiß ja nie als Außenstehender was du da für Dateien hast. ^^


    dragon99 schrieb:

    aktuell versuche ich einen Fileuploader mit einer Download Funktion zu programmieren.
    Skripten. Nicht Programmieren.

    Du machst zwars was ähnliches, aber es werden keine ausführbaren Anwendungen, sondern du hast ja dein PHP als Skript vorzuliegen was ständig verarbeitet wird.

    Programmieren ist wenn der Quellcode durch einen Kompiler geht später und aus der eigentlichen fertigen Anwendung dann nicht mehr der Quellcode öffentlich einsehbar ist.

    Deswegen nennt man das beim Programmieren auch Quellcode. Weil aus der Quelle von Anweisungen etc. das Programm entsteht.
    Und ein Skript bleibt ein Skript. Das wird nicht kompiliert, sondern wird wie bei einer Batchdatei auch ausgeführt. Sprich die Quelle ist ne Anweisungsliste. Das nennt man halt dann ein Skript.

    Skriptsprachen sind z.B. HTML, PHP, VBS, Ruby (RPG Maker), Python (Siehe Blender oder auch AVSPmod die mit Python Skripten arbeiten), JavaScript usw.

    Programmiersprachen sind dann aber Java, C#, C++, MS VB Schießmichtot, usw.

    Nur um das noch mal zu unterscheiden.


    Man macht zwars irgendwo das gleiche im Prinzip, nur wie die Sachen weiter genutzt werden macht den Unterschied.


    z.B. wenn einer deine PHP nutzen will für seine Seite, dann müsstest du ihn das PHP Skript geben. Weil als ausführbare Anwendung kannste ihn das schlecht geben, da PHP dies nicht kann.

    Wenn du aber etwas vergleichbares mit z.B. C# machst und gibst ihn dann das Programm dafür das du programmiert hast.


    Und ein Skript ist für jeden User einsehbar und änderbar. Ein bereits programmiertes ausführbares Programm kannst du aber nicht mehr einsehen oder ändern ohne weitere Kenntnis davon zu haben wie.
  • Sagaras schrieb:

    Skripten. Nicht Programmieren. [...]Man macht zwars irgendwo das gleiche im Prinzip, nur wie die Sachen weiter genutzt werden macht den Unterschied.
    Ja, man macht das Gleiche, und er macht sogar beides. Der Unterschied, den du beschrieben hast, ist der Unterschied zwischen interpretierter Sprache und kompilierter Sprache - beides Kategorien des generelleren Terminus "Programmiersprache". Ein Compiler ist nicht notwendig, um eine Sprache so zu nennen.

    Sagaras schrieb:

    Skriptsprachen sind z.B. HTML
    Nein. HTML ist ne Auszeichnungssprache.
    Videoempfehlungen:
    ShimmyMC
    NuRap
    ShimmyMC
    Napoleon Bonaparte
  • RealLiVe schrieb:

    Nein. HTML ist ne Auszeichnungssprache.
    Dynamisches HTML ist Skriptbasierend. DOM-Scripting. Schau nach.

    RealLiVe schrieb:

    Ja, man macht das Gleiche, und er macht sogar beides. Der Unterschied, den du beschrieben hast, ist der Unterschied zwischen interpretierter Sprache und kompilierter Sprache - beides Kategorien des generelleren Terminus "Programmiersprache". Ein Compiler ist nicht notwendig, um eine Sprache so zu nennen.
    Nein. Er Skriptet. Er programmiert nicht.
    Und du hast es grad selbst sogar bestätigt das es so ist.

    Ein ausführbares Programm was compiliert wurde in Maschienensprache wurde programmiert. Das heißt Programmiert, weil es vermutlich daraus hinaus läuft das es sich um ein Programm handelt.

    Ein Skript jedoch wird interpretiert wie du sagst. An sich sind es nur Anweisungen die ausgeführt werden von Dateien die das verstehen was da steht. Daher halt Interpretiert. An sich hat man also nicht programmiert, sondern nur geskriptet. Also nur Text geschrieben.

    Ein Quellcode ist an sich auch nur ein Skript. Bzw. das Skript ein Quellcode. Immerhin schreibt man ja nur Anweisungen. ABER wie es dann später weiter verwendet wird für welche Sprache macht den Unterschied ob es nun eine Skriptsprache oder eine Programmiersprache ist.

    Frag mal einen Professor der sich da auskennt. Der wird dir das auch so sagen.

    Das sind Abstraktionsgrade was was ist.


    Blankes HTML ist wie du auch schön aufgesagt hast eine Auszeichnungssprache. Weil sie nix anderes kann als Texte entsprechend zu formatieren. An sich nix anderes als ein schönes MS Office. Nur mit mehr Möglichkeiten.
    Sofern in HTML dynamische Sachen einfließen ist es ein Skript. Oder halt eben DOM-Scripting.

    Kannste gern alles nach schauen.



    Und wenn wir noch lange darum streiten, dann ist AVISynth auch eine Programmiersprache und Batch auch und VBS und JavaScript und und und. Wenn du mir weiter kommst das man eh alles programmiert.
    Also in AVISynth programmiere ich nicht, sondern bearbeite eigentlich Videos durch das Skripten. Also da wäre ich wirklich mal auf eine Erklärung von dir gespannt wie das bei dir alles heißt. ^^

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

  • Sagaras schrieb:

    Etwas traurig das als Programmierer nicht zu wissen was das ist. Hat mich etwas überrascht als du das geschrieben hast
    Ich bin nur Hobby-Programmierer der versucht zu lernen ^^


    Sagaras schrieb:


    ​Skripten. Nicht Programmieren.
    Ich glaube das ist ein leidiges und ewiges Thema der Hobby und Vollzeit Programmierer :D Wikipedia selbst bezeichnet Skriptsprache als Programmiersprachen... Nur für kleineres halt...
    Schau doch mal bei mir vorbei:
    twitch.tv/PandshanDE