[PHP] Probleme mit Dateieheadererkennung

henker

Registered User
Hallo.

Bei meinem Uploadscript macht mir ein Problem zu schaffen, welches das Auslesen des Dateiheaders bzw deren Vergleich betrifft.
Ich bekomme für einen Grossteil der Dateien, welche ich versuche über das Sript hochzuladen eine Fehlermeldung, dass es sich um keine gültige Datei handelt (bei .doc Dateien zum Beispiel keine gültige doc-Datei). Das ist zwar sinnvoll wenn der Dateiheader nicht mit dem in der Datenbank eingetragenen Header übereinstimmt, aber ein Problem wenn der Dateiheader richtig ist. ;)

Beispiel zip-Datei:
Dateiheader laut HEXEDITOR-MX: 504B0304 (die ersten 4 Byte).
In der DB stehen diese 4 Byte drin. Versuch ich jetzt aber die Datei hochzuladen, bekomme ich eine Fehlermeldung.

Bei pdf-Dateien dagegen klappt es ohne Probleme.

Mp3-Dateien, doc-Dateien und Zip-Dateien, als Beispiele, funktionieren nicht.
Dieser Codeschnippsel überprüft das Ganze:

PHP:
if($ext['typ'] == "doc") {
  $fp = @fopen($file,"r");
  $file_head = "";
  for ($c=0;$c<4;$c++) $file_head .= dechex(ord(fgetc($fp)));
}

Ich bin sowas von ratlos.

gruesse
henker
 
Grundsätzlich würde ich sagen, daß Du als Filemode ein "b" für binary aufnehmen solltest.
Zum anderen könnte man mal folgende Alternative statt der for-Schleife probieren:
PHP:
$file_head = bin2hex(fgets($fp, 4));
Sicherheitshalber sollte man vorher überprüfen, ob die Datei überhaupt 4 Zeichen enthält.

huschi
 
Deine Alternative hatte leider keinerlei Effekt bei mir.
Dieser (absolut nicht nachvollziehbare) Fehler tritt auch weiterhin auf.
Welche Möglichkeiten hätte ich eventuell noch? :confused:
 
Vielleicht gibts Du uns mal ein paar Vorlagen: INPUT und OUTPUT.
Also jeweils die ersten 4 Zeichen/Hexwerte einer Datei und was er dann daraus gemacht hat.

huschi.
 
Ich kann dir gerade nicht wirklich folgen, da ich nicht wirklich viel Ahnung, um es genauer zu sagen garkeine Ahnung, von PHP habe.

Eventuell kannst du mich ja trotzdem ein Stueck anleiten, so das man den Fehler eventuell weg bekommt?! :)

zum INPUT

Archivdatei(en) RAR hat den Hexwert 52617221.
Archivdateien ZIP haben den Hexwert 504B0304
MP3's den Hexwert 49443303
So steht er auch in der DB drin, allerdings macht das Script anscheinend etwas anderes daraus.

Den OUTPUT kann ich nicht bestimmen, da ich nicht weiss wie. :confused: :mad:
Sorry fuer die Umstände :o
 
Du lädst eine Datei hoch, die wirklich diese 4 Zeichen am Anfang hat und schaust nach welchen Wert $file_head damit erhält.

huschi.
 
Hm, wenn ich dich richtig verstanden habe, soll ich etwas tun, was das Script nicht zulässt :o

Wenn ich versuche eine MP3-Datei mit Hex 49443303 hochzuladen, bekomm ich ja bereits bei dem Versuch die Meldung, die Datei wäre ungültig (aufgrund der Überprüfung).
 
Sorry, aber da stellst Du Dich jetzt bisschen quer, oder?
Du wirst es doch auf die Reihe bekommen mal eben den von Deinen Script generierten String ausgeben zu lassen? (Zur not in einem zweiten Testscript.)
Das ist nun wirklich kein Ding der Unmöglichkeit.

huschi.
 
Hallo.

Hm, wenn ich dich richtig verstanden habe, soll ich etwas tun, was das Script nicht zulässt :o
Nicht ganz, ich verstehe das so, dass Du das Script erweitern sollst um die Ausgabe des Inhaltes von $file_head nachdem dieser bestimmt wurde und bevor die Ueberpruefung stattfindet.
Ausgabe einfach in ein log, in eine separate Datei oder sonstwohin.
Da sehe ich dann auch kein weiteres Problem drin, genau genommen verstehe ich auch nicht, was daran jetzt nicht gehen soll.

Ciao,
Mercy.
 
Naja, ich kann nichts machen, was ich nicht verstehe :o

Eine Ausgabe per "echo" würde reichen?

Nach
Code:
$file_head = "";

oder nach

Code:
for ($c=0;$c<4;$c++) $file_head .= dechex(ord(fgetc($fp)));

:confused:
 
Überleg mal ein bisschen:
Code:
$file_head = "";
echo $file_head;
Macht das Sinn?

Oder eher das:
Code:
for ($c=0;$c<4;$c++) $file_head .= dechex(ord(fgetc($fp)));
echo $file_head;

huschi.
 
Ist ja gut, nicht gleich hauen. Ich bin nicht der hellste :( :)

Ich hab es hinter die for-Anweisung gesetzt und siehe da die gewuenschte Ausgabe erhalten:

Die mp3-Datei bekam den Wert 4944333 statt 49443303

Mein erster Gedanke war, den Wert in der DB entsprechend ändern, so dass es passt. Allerdings sind es dann nicht 4 Byte, sondern nur 3 oder fast 3 oder? (Sorry fuer die Laienhafte Darstellung meiner Sicht der Dinge...)

Ich hab es natuerlich schon getestet und es funktioniert, allerdings frage ich mich warum.
 
Hallo!

Weil Deine Schleife beim letzten Byte die führende 0 nicht generiert (3 statt 03)

Gruß flyingoffice
 
Ich hab das jetzt mit weiteren Dateiheadern versucht.
Zip und doc.
Bei beiden musste ich die Headerinformationen in der DB "korrigieren".
Dieses "0" Problem scheint auch nicht auf die letzte Instanz beschraenkt zu sein, sondern bereits bei der dritten Zahl (zweites Byte) einzutreten (Festgestellt bei zip-Dateien -> Nur 3 Byte lang; aus 504B0304 wurde 504b34)

Bei doc-Dateien dagegen musste ich zwar korrigieren, allerdings nur con Grossschreibung in Kleinschreibung.

Finde ich alles irgendwie seltsam.
 
Hallo!

Natürlich, kommt halt darauf an, an welcher Stelle so ein Byte vorkommt. Aber sag mal ließt Du auch was andere Dir antworten?

Huschi said:
Mein Vorschlag mit bin2hex generiert auch die führende 0

Die Lösung Deines Problems ist doch schon längst geschrieben worden.

Gruß flyingoffice
 
Um ehrlich zu sein, kam das bevor ich fertig war mit meinem Post und meiner ist ja auch auf der zweiten Seite gelandet. Da bin ich gerade von ausgegangen , dass jetzt nichts sofort darauf kam.

Aber um darauf sofort einzugehen: Ich kann mit bin2hex ueberhaupt nichts anfangen ;)
 
Hallo!

Dafür hat Huschi doch in Posting #2 ein Beispiel gebracht. Etwas eigenintiative wäre schon angebracht.

Gruß flyingoffice
 
Back
Top