XHTMLforum

XHTMLforum (http://xhtmlforum.de/index.php)
-   Serveradministration und serverseitige Scripte (http://xhtmlforum.de/forumdisplay.php?f=80)
-   -   Uploader problem (http://xhtmlforum.de/showthread.php?t=54733)

Skullsplitter 26.11.2008 23:05

Uploader problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe ein kleines Problem und zwar folgendes:

In meinem Usercenter können User ein Anzeigebild (Avatar) hochladen.

Dies geschieht über dieses Formular:
HTML-Code:

<div id="inhalt3">
        <h1>Usercenter - Anzeigebild &auml;ndern</h1>
        <a href="index.php?nav=myaccount">zur&uuml;ck zur &Uuml;bersicht</a><br /><br />
    aktuelles Foto:<br />
    {FOTO}<br />
    <br />
        <form action="index.php?nav=user&do=saveavatar" method="post" enctype="multipart/form-data" name="step1" id="step1">
        <label>neues Foto:
        <input type="file" name="Foto" id="foto" title="Laden Sie hier ein Foto von Ihnen hoch."/>
        </label>
        <br />
      (max 2MB, nur *.jpg, *.jpeg Dateien, *.gif, wird auf 200x200px verkleinert)
      <br />
      <br />
      <input type="submit" name="speichern" id="speichern" value="speichern" title="Speichern der &Auml;nderungen."/>
    </form><br /><br />
    <form action="index.php?nav=user&do=delavatar" method="post" name="delete">
    <label>
    <input name="deleter" type="checkbox"/> Anzeigebild l&ouml;schen
    </label><br />

    <label>
    <input type="submit" name="loeschen" id="loeschen" value="l&ouml;schen" />
    </label>
    <br />
    </form>
</div>

Wie es sich bei einem Uploadscript gehört ist "enctype="multipart/form-data"" gesetzt.

Wenn nun in der Datei user.php dieser Verweis (nav=user&do=saveavatar) aufgerufen wird, funktioniert das zwar bei mir aufm Lokalhost, jedoch nicht auf meinem Webserver.

Dort lädt der irgendwie ins Unendliche und gibt nur einen weißen Bildschirm aus. Es werden keine Fehlermeldungen oder so angezeigt.

Die Datei wird allerdings auf den Server mit den Rechten, die mittels CHMOD gesetzt wurden, hochgeladen!

Wenn ich ein Bild bei mir lokal hochlade, habe ich das Problem, dass das Bild in einer sehr schlechten Qualität hochgeladen wird. Kann mir das bitte einer erklären? :oops:

Hier ein Beispiel:
http://xhtmlforum.de/attachment.php?...1&d=1227733431

Hier der Code aus der user.php:
PHP-Code:

    #############################
    //Anzeigebild speichern/hochladen
    #############################
            
case 'saveavatar':
                
//checken ob das Formular abgeschickt wurde
                
if(isset($_POST['speichern']))
                {
                    
//Avatar des Users
                    
if($_FILES['Foto']['tmp_name'] != "")
                    {
                        
//Nur Jpg und Gif erlaubt
                        
if($_FILES['Foto']['type'] == "image/jpeg" OR $_FILES['Foto']['type'] == "image/jpg" OR
                           
$_FILES['Foto']['type'] == "image/pjpeg" OR $_FILES['Foto']['type'] == "image/gif")
                        {
                        
//MAX 2 MB
                            
if($_FILES['Foto']['size'] < 2147483648)
                            {
                                
//hochladen des Fotos mit der upload_foto funktion
                                
$foto upload_foto($_FILES['Foto']['tmp_name'], $_FILES['Foto']['type'], "design/images/user_pics/");
                                if(
$foto != "false")
                                {
                                    
//Name des Bildes
                                    
if($_FILES['Foto']['type'] == "image/jpeg" OR $_FILES['Foto']['type'] == "image/jpg" OR
                                       
$_FILES['Foto']['type'] == "image/pjpeg")
                                    {
                                        
$neuer_name "design/images/user_pics/".$_SESSION['u_id'].".jpg";
                                    }
                                    else
                                    {
                                        
$neuer_name "design/images/user_pics/".$_SESSION['u_id'].".gif";
                                    }
                                    
                                    
//ermitteln des alten Bildes
                                    
$altesbild_sql mysql_query("SELECT `Foto` FROM `benutzer_daten`
                                                                WHERE `users_BenutzerID` = '"
.$_SESSION['u_id']."'");
                                    
                                    
//Wenn vorhanden, wird es gelöscht
                                    
if(mysql_num_rows($altesbild_sql) == 1)
                                    {
                                        
$altesbild_res mysql_fetch_array($altesbild_sql);
                                        
                                        
//löschen des alten Bildes, wenn gefunden
                                        
if(file_exists($altesbild_res[0]))
                                        {
                                            
//löschen
                                            
unlink($altesbild_res[0]);
                                        }
                                    }
                                    
                                    
//Updaten der Datenbank
                                    
$update_foto mysql_query("UPDATE `benutzer_daten` SET `Foto` = '".$neuer_name."' 
                                                                WHERE `users_BenutzerID` = '"
.$_SESSION['u_id']."'");
                                    
//Umbennen des Fotos
                                    
rename($foto$neuer_name);
                                    
                                    
//Laden der Templatefile - gibt die Erfolgsmeldung zurück
                                    
$save_tmp_file "design/templates/user_speichern.html";
                                    
$save_template = new template($save_tmp_file);
                    
                                    
//Ausgabe der Erfolgsmeldung (TEMPLATE)
                                    
$inhalt $save_template->returnTemplate();    
                                }
                                else
                                {
                                    
//Fehler - CHMOD konnte nicht gesetzt werden
                                    
$reg_tmp_file "design/templates/error.html";
                                    
$reg_template = new template($reg_tmp_file);                
                                    
$reg_template->ersetzen('ERROR',
                                    
'Das Foto <b>'.$_FILES['Foto']['name'].'</b> konnte nicht hochgeladen werden!<br /><br />
                                                                      <a href="javascript:history.back();">zurück</a>'
);
                                    
$inhalt $reg_template->returnTemplate();    
                                }
                            }
                            else
                            {
                                
//Fehler - größer als 2 MB
                                
$reg_tmp_file "design/templates/error.html";
                                
$reg_template = new template($reg_tmp_file);                
                                
$reg_template->ersetzen('ERROR',
                                
'Das Foto <b>'.$_FILES['Foto']['name'].'</b> ist größer als 2 MB!<br /><br />
                                                                  <a href="javascript:history.back();">zurück</a>'
);
                                
$inhalt $reg_template->returnTemplate();    
                            }
                        }
                        else
                        {
                            
//Fehler Falsches Format
                            
$reg_tmp_file "design/templates/error.html";
                            
$reg_template = new template($reg_tmp_file);                
                            
$reg_template->ersetzen('ERROR'
                            
'Das Foto <b>'.$_FILES['Foto']['name'].'</b> hat kein gültiges Format!<br /><br />
                                                              <a href="javascript:history.back();">zurück</a>'
);
                            
$inhalt $reg_template->returnTemplate();    
                        }
                    }
                }
                else
                {
                    
//Aufrufen der Seite ohne Formular abzuschicken
                    
$reg_tmp_file "design/templates/error.html";
                    
$reg_template = new template($reg_tmp_file);                
                    
$reg_template->ersetzen('ERROR''<b>Sie haben einen ungültigen Verweis aufgerufen!</b><br /><br />
                                                  <a href="javascript:history.back();">zurück</a>'
);
                    
$inhalt $reg_template->returnTemplate();    
                }
            break; 

Hier die "upload_foto"-Funktion

PHP-Code:

function upload_foto($filename$type$path)
{
    
//$path
    //liefert das Verzeichnis - ob das Bild von einem User oder Unternehmen hochgeladen wird!
    
    //eindeutiger zufallsname für das Bild!
    
$zufallsname md5(uniqid(rand(), TRUE));
    
    
$endung 'JPG';
    
    if(
$type == "image/jpeg" OR $type == "image/jpg"    OR $type == "image/pjpeg")
    {
        
$name $zufallsname.".jpg";
    }
    else
    {
        
$name $zufallsname.".gif";
        
$endung 'GIF';
    }
    
    
//Verschieben
    
if(move_uploaded_file($filename$path.$name))
    {    
        
//schreib- und leserechte für das bild 
        //sonst fehler auf servern mit hohen sicherheitseinstellungen
        
if(chmod($path.$name0755))
        {
            
//Bildmaße ermitteln
            
$abmessungen getimagesize($path.$name);
            
            
//Die Datei
            
$file $path.$name;
            
            
$width_orig $abmessungen[0];
            
$height_orig $abmessungen[1];
            
            
//Maximale Höhe des neuen Bildes!
            
$width_neu 200;
            
$height_neu 200;
            
            
//name des Bildes
            
$thumb_name $path.$name;
            
            
//Erzeugen eines neuen Bildes mit den Abmessungen
            
$image_neu imagecreate($width_neu$height_neu);
            
            if(
$endung == "JPG")
            {
                
$image_alt imagecreatefromjpeg($file);
                
imagecopyresized($image_neu$image_alt0000$width_neu$height_neu$width_orig$height_orig);
                    
                
imagejpeg($image_neu$thumb_name100);
            }
            else
            {
                
$image imagecreatefromgif($file);
                
imagecopyresized($image_neu$image_alt0000$width_neu$height_neu$width_orig$height_orig);

                
imagegif($image_neu$thumb_name100);
            }
            
            return 
$thumb_name;
        }
        
//Schreibrechte vergeben fehlgeschlagen
        
else
        {
            return 
false;
        }
    }
    
//Bild hochladen fehlgeschlagen
    
else
    {
        return 
false;
    }


Ich habe im Hintergrund, für die Templates, die Template-Klasse, die ich mit der Hilfe von ein paar Usern hier aus dem Forum geschrieben habe. (hier die Klasse)

Vielen, vielen herzlichen Dank für eure Hilfe!

Bin über jeden Beitrag sehr dankbar!

Gruß
Stefan

Gumbo 26.11.2008 23:09

Verwende mal die „imagecreatetruecolor()“- statt die „imagecreate()“-Funktion.

Skullsplitter 26.11.2008 23:17

Nabend!

Das ging ja ruck zuck!

Mit der Funktion imagecreatetruecolor() ist das Bild schon mal in der richtigen Qualität. :)

Vielen herzlichen Dank!

Auf dem Server hat sich allerdings nicht geändert.
Hatte schon Hoffnungen, dass die Funktion imagecreate() ihm zugesetzt hat, aber dem war leider nicht so.

Er liefert immer noch ein weißes Bild. :(

Gruß

paracelsus 27.11.2008 08:59

Möglicherweise hat das Bild denselben Dateinamen, und das alte befindet sich daher noch im Browsercache?

Skullsplitter 27.11.2008 09:12

Hmh das glaube ich weniger.

Habe das ganze auch auf meinem Laptop versucht und dort hat es auch nicht geklappt.

Entwickle und schreibe sonst am PC.

Könnte es eventuell mit den Schreibrechten zusammenhängen?

Ich habe derzeit, auf grund dieses Themas, auf dem Ordner, indem die Bilder landen, CHMOD 0755.

Das Bild erhält ebenfalls CHMOD 0755.

Könnte es eventuell damit zusammenhängen?

Oder ist einfach mein Upload-Script nicht Fehlerfrei?

Gruß
Skull

inta 27.11.2008 10:49

Zitat:

Zitat von Skullsplitter (Beitrag 412191)
Könnte es eventuell mit den Schreibrechten zusammenhängen?

Ich habe derzeit, auf grund dieses Themas, auf dem Ordner, indem die Bilder landen, CHMOD 0755.

Wird denn eine Datei in dem Verzeichnis angelegt?
Wenn ja, dann kann es schon mal nicht an den Rechten liegen.

Zitat:

Zitat von Skullsplitter (Beitrag 412191)
Das Bild erhält ebenfalls CHMOD 0755.

Willst du die Grafik ausführen? Für Dateien reicht 644.

Skullsplitter 27.11.2008 12:05

Hallo.

Ja, das Bild wird im Verzeichnis angelegt.

Okay, dann werde ich den CHMOD mal auf 644 ändern beim Upload. ;)

Sieht jemand eventuell einen Fehler im Script? :oops:

Danke,
Gruß

protonenbeschleuniger 27.11.2008 12:23

Ich kann kein PHP, aber üblicherweise geben Funktionen als Rückgabewert informationen über Erfolg oder Mißerfolg einer Operation, ist das in PHP nicht so?
Oder warum prüfst du das nicht?

Skullsplitter 27.11.2008 13:24

Apropo prüfen:

Bei meine Fehlerrückgabewerte werden als boolische Werte zurück gegeben und ich prüfe, ob sie mit $upload != 'false'.

Also als wären sie Strings.

Werde das mal ändern.

Wenn beim Upload ein Fehler auftritt, wird "false" zurück gegeben. Also gibt die Funktion schon einen Fehler zurück.

Glaube du meinst aber eine art Error-Handler, der auch eine dementsprechende Meldung liefert, richtig?

Najo finde das relativ schlecht, weil was interessiert einen User eine Fehlermeldung wie "CHMOD konnte nicht gesetzt werden".

Da bleibe ich beim False und gebe eine allgemeine Fehlermeldung zurück, die auch für den User verständlich ist. ;)

Danke für deinen Beitrag. Dank dir bin ich auf den Fehler mit dem Variablentyp gestoßen! :)

protonenbeschleuniger 27.11.2008 13:43

Zitat:

Zitat von Skullsplitter (Beitrag 412226)
Glaube du meinst aber eine art Error-Handler, der auch eine dementsprechende Meldung liefert, richtig?

Najo finde das relativ schlecht, weil was interessiert einen User eine Fehlermeldung wie "CHMOD konnte nicht gesetzt werden".

Da bleibe ich beim False und gebe eine allgemeine Fehlermeldung zurück, die auch für den User verständlich ist. ;)

Ja toll, das heißt du wirst nie erfahren wenn etwas falsch läuft.

Wenn du die Fehlermeldungen nicht anzeigen lassen willst, kannst du sie natürlich auch in eine Datei schreiben. Aber so wie du es jetzt praktizierst muss du schon viel Gottvertrauen haben und merkst aber wie schwierig es ist, wenn mal was nicht läuft, die Stelle des Fehlers zu finden.


[EDIT]Weil ich grad mal den Code etwas ganauer angeschaut habe, so wie du es jetzt machst würde dir der Code in jeder anderen Programmiersprache um die Ohren fliegen. Leider ist PHP ja so gutmütig, wie der IE wenn es um Fehler im JS Code geht, dass es freiwillig nur schwere Syntaxfehler meldet. Ich würde ohne error_reporting(E_ALL); nicht anfangen zu entwickeln


Alle Zeitangaben in WEZ +2. Es ist jetzt 06:42 Uhr.

Powered by vBulletin® Version 3.8.11 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.

© Dirk H. 2003 - 2023