PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : file upload per post - zwei kleine fragen


pRoPh3t
27.07.2006, 19:55:27
hallo leute,
bin gerade dabei meine page weiter zu basteln und bin auf zwei sachen gestoßen die mir fragen aufwerfen.

1. der datei typ ($_FILES['XXX']['type']) im ie und firefox

nach einem upload lasse ich mir die inhalte von $_file ausgeben, darunter befindet sich ja auch der file typ, ich habe nun festgestellt, das beim hochladen ein und des selben bildes (einmal im ie und einmal im firefox) zwei verschiedene werte angezeigt werden. zwar handelt es sich beide male um ein image jedoch wird der typ unterschiedlich angegeben.

im ie:
type: image/pjpeg

im firefox:
type: image/jpeg

wie ihr sehen könnt wird dem typ im ie noch ein p vorrangestellt, dies ist zwar nicht weiter wild für mein script jeodoch würde mich der grund dieser erscheinung interessieren :)


2. anzeigen des hochgeladenen bildes

auf meiner seite kann man im punkt profil, wie sollte es auch anders sein, sein profil betrachten. darunter findet man, falls angegeben auch seinen avatar. auf der selben seite wo das bild angezeigt wird befindet sich auch das formular zum bearbeiten seine angaben, unter anderem kann hier auch ein neuer avatar hochgeladen werden. funktioniert im firefox auch alles wunderbar, klick auf aktualisieren und das bild wird hochgeladen und nach beendigung auch dierekt aktualisiert angezeigt. im internet explorer hingegen wird so lange der alte avatar angezeigt bis ich auf den button "seite neu laden" klicke, erst dann wird der neue avatar angezeigt. dazu muss ich sagen das der neue avatar natürlich den alten überschreibt und den gleichen namen erhält. meine vermutung ist nun das der ie die namen der bilder checkt und, falls dieses bild schon im chache vorhanden ist, dieses nicht erst vom webserver lädt sondern aus seinem temp verzeichnis lädt.
meine frage ist nun, ob es eine möglichkeit gibt, dieses verhalten des ie zu umgehen.

ich glaube zwar nicht das ein auszug meines scriptes von belangen ist, für leute die es interessiert poste ich es trotzdem (dazu muss gesagt werden das es sich nur um das gerüsst handelt, abfragen der bild abmessung und größe und sicherheitsrelevante sachen sind noch nicht eingebunden)

//prüfen ob das oploadfeld einen wert hat
if ( $_FILES['avatar']['error'] == "0" ) {
//prüfen ob das destinationsverzeihnis vorhanden ist, wenn nicht dann wird es mit mkdir() angelegt
if( ! is_dir("gfx/user_img/$session_id/") ) {
mkdir("gfx/user_img/$session_id/", 0777);
}
//hier wird das destinationsverzeichnis in einer variabel hinterlegt
$path = "gfx/user_img/".$session_id."/";
//hier wird der typ des bildes bestimmt, entweder jpg oder gif und der dateinamen in einer variabel hinterlegt
switch( $_FILES['avatar']['type'] ) {
case "image/pjpeg" || "image/jpeg":
$img = "avatar.jpg";
break;
case "image/gif":
$img = "avatar.gif";
break;
}
//speichern des bildes in verzeichnis $uploaddir mit dem dateinamen $img
move_uploaded_file($_FILES['avatar']['tmp_name'], $path . $img);
}
print 'clientname: '.$_FILES['avatar']['name'].'<br>';
print 'type: '.$_FILES['avatar']['type'].'<br>';
print 'size: '.$_FILES['avatar']['size'].'<br>';
print 'tmp name: '.$_FILES['avatar']['tmp_name'].'<br>';
print 'error: '.$_FILES['avatar']['error'].'<br>';


ich freue mich schon auf eure antworten

mfg
matthias

xabbuh
27.07.2006, 22:24:34
wie ihr sehen könnt wird dem typ im ie noch ein p vorrangestellt, dies ist zwar nicht weiter wild für mein script jeodoch würde mich der grund dieser erscheinung interessieren :)
Die Frage solltest du wohl eher an die Entwickler des IE richten. Aber wie du selbst bemerkt hast, wird der Datei vom Client festgelegt. Darauf solltest du dich also nie verlassen, sondern stattdessen den Datei selbst mit mime_content_type() ermitteln.

meine frage ist nun, ob es eine möglichkeit gibt, dieses verhalten des ie zu umgehen.
Häng einfach noch einen URL-Parameter an den Bildnamen an, der sich bei jedem Aufruf ändert (beispielsweise den UNIX-Timestamp):

printf('<img src="foo.jpg?%d" />', time());

pRoPh3t
28.07.2006, 11:59:19
Die Frage solltest du wohl eher an die Entwickler des IE richten. Aber wie du selbst bemerkt hast, wird der Datei vom Client festgelegt. Darauf solltest du dich also nie verlassen, sondern stattdessen den Datei selbst mit mime_content_type() ermitteln.

bis jetzt prüfe ich den dateitypen mit hilfe des file arrays...
wo besteht denn der unterschied von mime_content_type() und $_file[xxx][type]?
so wie ich dich verstanden habe ist es besser die datei mit mime_content_type zu ermitteln aber warum? liefern sie im prinzip nicht beide das gleiche ergebniss, indem sie die datei anhand der file extension bestimmen?
zudem läuft die funktion nicht bei mir (Call to undefined function mime_content_type()), naja die syntax ist jedenfalls zu 100% richtig. habe mal ein wenig rumgelesen und gehört das die funktion diese funktion nur läuft, wenn man sich direkt den Quellcode per cvs holt und ihn dann kompiliert. ich verwende im moment php5.0.3 und standartmäßig läuft sie nicht, ka warum.
habe als test zb. einfach mal versucht eine .php datei im wurzelverzeichnis zu bestimmen >echo mime_content_type('test.php');< aber wie gesagt kommt nur undefined function.
vieleicht kann mir da noch einer weiter helfen.
danke schonmal im vorraus :)

mfg
matthias

xabbuh
28.07.2006, 12:25:35
so wie ich dich verstanden habe ist es besser die datei mit mime_content_type zu ermitteln aber warum? liefern sie im prinzip nicht beide das gleiche ergebniss, indem sie die datei anhand der file extension bestimmen?
Nein. mime_content_type() ermittelt den Dateityp anhand des Inhaltes der Datei. Das Element type im $_FILES-Array wird dagegen mehr oder wenig beliebig vom Client vergeben (sprich: kann völlig frei manipuliert werden).

meikel (†)
28.07.2006, 13:41:30
zudem läuft die funktion nicht bei mir (Call to undefined function mime_content_type()),
Pech. Da wurde Dein PHP nicht mit --with-mime-magic compiliert.

pRoPh3t
28.07.2006, 15:59:16
Pech. Da wurde Dein PHP nicht mit --with-mime-magic compiliert.

hmm, schöne antwort aber hast du auch einen lösungsvorschlag für mich ;)
ich benutze local xampp, ich denke hier wird es noch einzubinden sein...
wie sieht es jedoch mit dem webspace aus? kann ich es dort auch noch nachträglich einrichten oder kommt es auf den anbieter an? eine bruachbare php version ist natürlich vorraussetzung...

nachtrag
habe gerade einen alten thread von dir gefunden wo du den link http://de3.php.net/manual/de/ref.mime-magic.php gepostet hast, werde ich mir jetzt mal genauer anschauen...
thx

pRoPh3t
28.07.2006, 17:26:04
habe mir jetzt einige seite durchgelesen, aber ich bekomme die funktion einfach nicht ans laufen!
ist das überhaupt einfach durch ein paar angaben in der php.ini zu bewerkstelligen oder muss noch was zusätzlich installiert werden?
ich habe mal meine verzeichnisse durchgesehen und zweimal die datei magic.mime gefunden.
beide sind im php verzeichnis, eines im unterordner extras und das andere im unterordner php4.
in der php.ini habe ich nun unter modules den punkt
[mime_magic]
mime_magic.magicfile = c:\apachefriends\xampp\php\extras\magic.mime
und einmal mit relativer pfadangabe
mime_magic.magicfile = \extras\magic.mime
eingefügt, jedoch ohne erfolg, kann mir vieleicht mal jamnd verraten wie ich die funktion endlich mal ans laufen bekomme? :/

mfg
matthias

xabbuh
28.07.2006, 22:02:34
Hast du die richtige php.ini editiert (mit phpinfo() prüfen)? Hast du den Apache, falls PHP als Modul läuft, neugestartet?

meikel (†)
29.07.2006, 05:33:32
eingefügt, jedoch ohne erfolg, kann mir vieleicht mal jamnd verraten wie ich die funktion endlich mal ans laufen bekomme? :/
1. richtige php.ini bearbeiten. phpinfo anzeigen lassen und nachgucken
Configuration File (php.ini) Path C:\xampp\apache\bin\php.ini
2. das suchen ;extension=php_mime_magic.dll und das Kommentarzeichen entfernen:
extension=php_mime_magic.dll
3. Apache neu starten

pRoPh3t
29.07.2006, 22:30:04
hallo,
danke für eure hilfe läuft nun alles bei mir.
habe mein php modul schon neugestartet und ich habe auch alle beiden einträge richtig vorgenommen (.dll aktiviert und die magic_mime eingebunden)
mein fehler war, ich habe die php.ini in php ordner und nicht im apache bearbeitet.
naja, echt ne kleinigkeit und schon fast peinlich ;)

nebenbei gefragt: hat die php.ini und php5.ini im php ordner irgendwelche bedeutung oder wird grundsätzlich auf die im apache ordner zugegriffen?
ist zwar nicht so wichtig aber würde mich schon interessieren :)

mfg
matthias

nilitsch
19.09.2006, 22:52:18
Hallo miteinander,

ich habe nun das gleiche Problem wie Du Matthias.

Ich versuche mime magic zum Laufen zu bringen. Ich habe die php.ini umkonfiguriert:

Einmal mit absoluter Pfadangabe
; PATH to mime.magic
mime_magic.magicfile = "E:\Server\php\magic.mime"

und mit relativer Pfadangabe
; PATH to mime.magic
mime_magic.magicfile = ".\magic.mime"

und das ; bei entfernt
extension=php_mime_magic.dll

Aber anscheinend findet er die dll nicht. Wenn ich nämlich den Apache neu starte wird mir folgende Warning angezeigt:
"Unknown(): Unable to load dynamic library '.php_mime_magic.dll' - Das angegebene Modul wurde nicht gefunden."


Im Ordner E:\Server\php\extensions ist zwar ich dieses Modul vorhanden. Ich weiss nicht warum er das nicht findet?

Kann mir jemand bitte weiterhelfen?

Vielen Dank.