Sonderzeichen werden nicht angezeigt

Snake3333

Mitglied
Guten Tag zusammen,

ich habe nun ja ein Upload Skript, soweit funktioniert auch alles. Wenn eine Datei hochgeladen wird dann zeigt er normalerweise auch den richtigen Pfad dahin an ausser wenn z.B. ein "_" im Namen ist.
Habe die SuFu schon benutzt nur trifft es nicht auf meine Frage zu deswegen erstelle ich ein neues Thread.

Hier mal mein Skript;
PHP:
<?php
    echo '<p>';
    $upload_dir = $_SERVER['DOCUMENT_ROOT'].'/upload/';  
    if (isset($_FILES['datei']))
    {
        if(is_uploaded_file($_FILES['datei']['tmp_name']))
        {
            $datei = $upload_dir.$_FILES['datei']['name'];  
            $can_upload = true;
            if(file_exists($datei))
            {
                $dateiname = explode(".",$_FILES['datei']['name']);
                $dateiname[0] .= "2.";
                $datei = $upload_dir.$dateiname[0].$dateiname[1];
                $filename = $dateiname[0].$dateiname[1];
                if (file_exists($datei))
                {
                    echo "Upload der Datei nicht moeglich, da beide Namen Varianten vorhanden sind. Bitte einen anderen Dateinamen waehlen!";
                    $can_upload = false;
                }
                else
                {
                    echo "<p style='color:#CD7054'><b>Dateiname bereits vorhanden!</b> Die Datei wurde unter $filename abgespeichert!";
                    $can_upload = true;
                }
            }
            if ($can_upload && move_uploaded_file($_FILES['datei']['tmp_name'], $datei))
            {
                echo "<p style='color:#CD7054'>Sie haben soebend<br>http://hundeschule-redbone.de/upload/<strong>$filename</strong> 

<br>erfolgreich hochgeladen.<a  href='/upload/$filename'>Voransicht</a><br>Zum Einfügen ins Forum können  Sie auch folgende 

Cods benutzen:<br><hr>[ img]  http://hundeschule-redbone.de/upload/$filename
[ /img]<br><hr>[grafik]
http://hundeschule-redbone.de/upload/$filename
[/grafik]";
            }
            else
            {
                echo "<p style='color:#c00'>$filename konnte  <strong>nicht</strong> hochgeladen  

werden!".$_FILES['userfile']['error']."</p>";
            }
        }

    }
?>
<br><hr>

Hat jemand eine Lösung?
 
Das Script ist nicht recht überdacht worden.
Was wenn eine Datei mehrere Punkte im Dateinamen hat? Deswegen solltest, du sowieso bei einem Fileupload einen neuen Dateinamen übergeben, beispielsweise, einen MD5 Hash oder einen prefix inkl. id :)

Du müsstest also erst die Dateiendung raussuchen und dabei schon beim Upload, gewisse "Regeln" aufstellen.

Human Readable:

PHP:
    $upload_dir = $_SERVER['DOCUMENT_ROOT'].'/upload/';
		$filetyparr = array('jpg', 'rar');
    if (isset($_FILES['datei']))
    {
				$filetyp = preg_match('~[a-z0-9].*?[^\.](\.\w{2,})~i', $filename, $s);
				$newfilename = md5(uniqid(rand(),false)).$s[1];
        $datei = $upload_dir.$newfilename;  
					
				/* -- */
					
        $error = "";
				$error .= file_exists($datei) 
				? '<b>Dateiname bereits vorhanden!</b> Die Datei wurde unter '.htmlspecialchars($filename).' abgespeichert!<br />'
				: '';
				$error .= !in_array(substr($s[1],1),$filetyparr) 
				? 'Die Dateiendung entspricht nicht den Upload-Regeln!<br />' : '';
					
				/*-- */
					
				echo strlen($error) == 0 && move_uploaded_file($_FILES['datei']['tmp_name'], $datei)
? '<p style="color:#CD7054">Sie haben soebend<br>http://hundeschule-redbone.de/upload/<strong>'.$newfilename.'</strong> 

<br>erfolgreich hochgeladen.<a href="/upload/'.$newfilename.'">Voransicht</a><br>Zum Einfügen ins Forum können  Sie auch folgende 

Cods benutzen:<br><hr>[ img]  http://hundeschule-redbone.de/upload/'.$newfilename.'
[ /img]<br><hr>[grafik]
http://hundeschule-redbone.de/upload/'.$newfilename.'
[/grafik]' 
: '<p style="color:#c00">Ihr Upload konnte wegen einem Tempor&auml;ren Fehler <strong>nicht</strong> hochgeladen werden!</p>'. $error;
					
        }

Oder so:

PHP:
$upload_dir = $_SERVER['DOCUMENT_ROOT'].'/upload/';$filetyparr = array('jpg','rar');if (isset($_FILES['datei'])){$filetyp = preg_match('~[a-z0-9].*?[^\.](\.\w{2,})~i',$filename, $s);$newfilename = md5(uniqid(rand(),false)).$s[1];$datei = $upload_dir.$newfilename; $error ="";$error .= file_exists($datei) ? '<b>Dateiname bereits vorhanden!</b> Die Datei wurde unter '.htmlspecialchars($filename).' abgespeichert!<br />' :'';$error .= !in_array(substr($s[1],1),$filetyparr) ? 'Die Dateiendung entspricht nicht den Upload-Regeln!<br />' :''; echo strlen($error) == 0&&move_uploaded_file($_FILES['datei']['tmp_name'], $datei)? '<p style="color:#CD7054">Sie haben soebend<br>http://hundeschule-redbone.de/upload/<strong>'.$newfilename.'</strong> <br>erfolgreich hochgeladen.<a href="/upload/'.$newfilename.'">Voransicht</a><br>Zum Einfügen ins Forum können Sie auch folgende Cods benutzen:<br><hr>[ img] http://hundeschule-redbone.de/upload/'.$newfilename.'[ /img]<br><hr>[grafik]http://hundeschule-redbone.de/upload/'.$newfilename.'[/grafik]' : '<p style="color:#c00">Ihr Upload konnte wegen einem Tempor&auml;ren Fehler <strong>nicht</strong> hochgeladen werden!</p>'. $error;} ?>
 
Zuletzt bearbeitet:
Erstmal dankeschön für deine Mühe, nur leider kommt eine Fehlermeldung;
Warning: in_array() [function.in-array]: Wrong datatype for second argument in /mnt/web3/42/81/51163381/htdocs/upload/upload_offiziel.php on line 25

Und bei der anderen Variante ist diese Fehlermeldung da;
Warning: in_array() [function.in-array]: Wrong datatype for second argument in /mnt/web3/42/81/51163381/htdocs/upload/upload_offiziel.php on line 10

Habe auch gerade gesehen das bei meinen Code das ich hier reingesetzt habe beim ersten hochladen Fehlerhaft ist mit der Anzeigung des Links, beim zweitenmal, also wo er dann eine "2" hinten dran setzt das funktioniert.
 
Jetzt wird aber kein Ergebniss angezeigt sondern einfach nur das Fenster ohne irgendeinen Satz. Kannst du denn Fehler finden?
 
Kann mir einer wohl bei diesen Code helfen, der Fehler wurde schon einen Beitrag vor diesem hier genannt, hier nochmal der Code
PHP:
   $upload_dir = $_SERVER['DOCUMENT_ROOT'].'/upload/';
        $filetyparr = array('jpg', 'rar');
    if (isset($_FILES['datei']))
    {
                $filetyp = preg_match('~[a-z0-9].*?[^\.](\.\w{2,})~i', $filename, $s);
                $newfilename = md5(uniqid(rand(),false)).$s[1];
        $datei = $upload_dir.$newfilename;  
                    
                /* -- */
                    
        $error = "";
                $error .= file_exists($datei) 
                ? '<b>Dateiname bereits vorhanden!</b> Die Datei wurde unter '.htmlspecialchars($filename).' abgespeichert!<br />'
                : '';
                $error .= !in_array(substr($s[1],1),$filetyparr) 
                ? 'Die Dateiendung entspricht nicht den Upload-Regeln!<br />' : '';
                    
                /*-- */
                    
                echo strlen($error) == 0 && move_uploaded_file($_FILES['datei']['tmp_name'], $datei)
? '<p style="color:#CD7054">Sie haben soebend<br>http://hundeschule-redbone.de/upload/<strong>'.$newfilename.'</strong> 

<br>erfolgreich hochgeladen.<a href="/upload/'.$newfilename.'">Voransicht</a><br>Zum Einfügen ins Forum können  Sie auch folgende 

Cods benutzen:<br><hr>[ img]  http://hundeschule-redbone.de/upload/'.$newfilename.'
[ /img]<br><hr>[grafik]
http://hundeschule-redbone.de/upload/'.$newfilename.'
[/grafik]' 
: '<p style="color:#c00">Ihr Upload konnte wegen einem Tempor&auml;ren Fehler <strong>nicht</strong> hochgeladen werden!</p>'. $error;
                    
        }
 
Puh, ich hab das erstmal etwas, ehm, lesbarer gemacht. Du solltest deinen Code echt etwas schöner schreiben. Diese Kurzschreibweisen sind wirklich keine gute Wahl.
Versuch mal folgendes:
PHP:
    $upload_dir = $_SERVER['DOCUMENT_ROOT'].'/upload/';
    $filetyparr = array('jpg', 'rar');

    if (isset($_FILES['datei']))
    {
        $filetyp = preg_match('~[a-z0-9].*?[^\.](\.\w{2,})~i', $filename, $s);
        $newfilename = md5(uniqid(rand(),false)).$s[1];
        $datei = $upload_dir.$newfilename;  

        $error = '';

        if( file_exists( $datei ) )
        {
            $error .= '<b>Dateiname bereits vorhanden!</b> Die Datei wurde unter '.htmlspecialchars( $filename ).' abgespeichert!<br />';
            $err = 1;
        }

        if( !in_array( substr( $s[1],1 ),$filetyparr ) )
        {
            $error .= 'Die Dateiendung entspricht nicht den Upload-Regeln!<br />';
            $err = 1;
        }

        if( ( empty( $err ) || $err != 1 ) && move_uploaded_file( $_FILES['datei']['tmp_name'], $datei ) )
        {
            echo '<p style="color:#CD7054">Sie haben soebend<br>http://hundeschule-redbone.de/upload/<strong>'.$newfilename.'</strong> 
                    <br>erfolgreich hochgeladen.<a href="/upload/'.$newfilename.'">Voransicht</a><br>Zum Einfügen ins Forum können  Sie auch folgende 
                    Cods benutzen:<br><hr>[ img]  http://hundeschule-redbone.de/upload/'.$newfilename.'
                    [ /img]<br><hr>[grafik]http://hundeschule-redbone.de/upload/'.$newfilename.'[/grafik]';
        }
        else
        {
            echo '<p style="color:#c00">Ihr Upload konnte wegen einem Tempor&auml;ren Fehler <strong>nicht</strong> hochgeladen werden!</p><br />'. $error;
        }
    }
 
Ja, deine Dateiendungs-Suche gibt dir die Endung mit Punkt ( .zip, .jpg... ) zurück.
Ändere mal dein Array so ab:
PHP:
$filetyparr = array('.jpg', '.rar');

(Was übrigens ein echo auf $s[1] dir auch gezeigt hätte)
 
Zurück