php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 12.01.2012, 13:33  
Lapje
Gast
 
Beiträge: n/a
Standard Probleme mit $_FILES und isset...

Hallo zusammen,

ich sitze gerade an einem Uploadformular für Bilder und habe einen deftigen Hänger - oder ein Verständnisproblem!

Folgendes: Ich habe ein Formular, in dem man 5 Bilder (jeweils Haupt- und Vorschaubild) hochladen kann. Es werden immer 5 Felder angezeigt. Es soll aber auch geprüft werden, ob diese Eingabefelder gefüllt sind. Mein Gedanke war jetzt folgender:

- prüfen obdas jeweilige $_FILES überhaupt vorhanden ist (sicher ist sicher)
- prüfen ob sich ein File darin befindet.

Nur diese sollen dann hochgeladen werden.

Meine Abfrage war folgende:

PHP-Code:
if(((!isset($_FILES["bild_serie"][$i])) || ($_FILES["bild_serie"]["tmp_name"][$i] == ''))
&& ((!isset(
$_FILES["bild_serie_vorschau"][$i])) || ($_FILES["bild_serie_vorschau"]["tmp_name"][$i] == '')))
{


Soll heißen: Wenn S_FILES vorhanden oder nicht gefüllt ist soll eine Aktion stattfinden.

Nur leider findet die Aktion auch dann statt, wenn die Datei gefüllt ist.

Wenn ich das ganze so mache:

PHP-Code:
if(((!isset($_FILES["bild_serie"]["tmp_name"][$i])) || ($_FILES["bild_serie"]["tmp_name"][$i] == ''))
&& ((!isset(
$_FILES["bild_serie_vorschau"]["tmp_name"][$i])) || ($_FILES["bild_serie_vorschau"]["tmp_name"][$i] == '')))
{


dann funzt es. Obwohl ich mir nicht vorstellen kann, dass dies richtig ist.

Kann mir jemand ein wenig auf die Sprünge helfen?

Besten dank

Lapje


P.S. Die SF habe ich nach $_FILES und isset durchsucht, aber nur zwei ältere Beiträge gefunden
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 12.01.2012, 14:34  
Erfahrener Benutzer
 
Benutzerbild von wolf29
 
Registriert seit: 17.03.2010
Beiträge: 1.833
PHP-Kenntnisse:
Fortgeschritten
wolf29 wird schon bald berühmt werdenwolf29 wird schon bald berühmt werden
Standard

Hi,

ähm..schau Dir bitte mal folgendes Tut an (Beispiel):

http://www.php.net/manual/en/features.file-upload.php


mfg wolf29
__________________
while (!asleep()) sheep++;

Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.
wolf29 ist offline   Mit Zitat antworten
Alt 12.01.2012, 17:21  
Lapje
Gast
 
Beiträge: n/a
Standard

Verstehe ich das richtig, dass ich nicht $_FILES[...] auf vorhandensein prüfen muss, sondern $_POST[...]? Oder bin ich jetzt komplett in den Bohnen...???
  Mit Zitat antworten
Alt 12.01.2012, 18:26  
meikel
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von Lapje Beitrag anzeigen
Verstehe ich das richtig,
Nein, das verstehst Du nicht richtig.

Formular:
Code:
<form action="files_verwursten.php" method="post" enctype="multipart/form-data">
<p>Pictures:
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="submit" value="Send" />
</p>
</form>
files_verwursten.php
PHP-Code:
<?php
if (! empty($_POST['send']) and ! empty($_FILES["pictures"])){
 foreach (
$_FILES["pictures"]["error"] as $key => $error) {
    if (
$error == UPLOAD_ERR_OK) {
        
$tmp_name $_FILES["pictures"]["tmp_name"][$key];
        
$name $_FILES["pictures"]["name"][$key];
        
move_uploaded_file($tmp_name"data/$name");
    }
 }
}else{
 echo 
'keine files, keine Kekse.';
}
?>
empty() beinhaltet isset()

Dem leicht angepaßten Handbuchbeispiel fehlt die Fehlerbehandlung:
-> stimmt der content-type? Falls Bild -> getimagesize()
sonst:
$finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension

Die Annahme, die Fileextension würde garantiert den content-type repräsentieren, endet im schlimmsten Fall mit einer "feindlichen Übernahme".

-> Name korrekt aka rawurlencode($name), falls das File verlinkt werden soll: Umlaute, Leerzeichen und diverse Sondernzeichen müssen dann konvertiert werden.

->Was soll passieren, wenn es schon ein gleichnamiges File gibt: überschreiben oder umbenennen?

Denke daran: (auch) $_FILE wird vom Client gefüttert und der kann schlimmer lügen, als die Polizei erlaubt.
  Mit Zitat antworten
Alt 12.01.2012, 23:58  
Lapje
Gast
 
Beiträge: n/a
Standard

So...habe ein wenig gelesen und ein paar Sachen zusammengetragen...aber irgendwie funzt das ganze noch nicht.

Erstmal der Code...ich denke durch die Kommentare ist er recht erklärend:

PHP-Code:
// Bilderupload
        
// Prüfen ob Formular gesendet
if (empty($_POST['gesendet']))
{
    for (
$i=0$i 1$i++)
    {
        
//Prüfen ob Dateien ausgewählt wurden
        
if(empty($_FILES["bild_serie"][$i]) || empty($_FILES["bild_serie_vorschau"][$i]))
        { 
            
$_SESSION["rueckgabe"] = "Es wurde keine Datei gewählt";
            
header("Location: http://xxx/admin_bilder_serie.php?aktion=1&id=" $_POST["id"] . "");
            exit;
        }
           
        
// Prüfen ob Endung erlaubt
        
        // Whitelist Endung
        
$whitelist_endung = array('.jpg''.jpeg');                
        
        foreach(
$whitelist_endung as $endung)
        {
            if((!
preg_match("/$endung\$/i"$_FILES["bild_serie"]["name"][$i])) || 
                (!
preg_match("/$endung\$/i"$_FILES["bild_serie_vorschau"]["name"][$i])))
            {
                
$_SESSION["rueckgabe"] = "Es wurde ein falscher Dateityp gewählt. 
                    Bitte nur .jpg oder .jpeg verwenden"
;
                
header("Location: http://xxx/admin_bilder_serie.php?aktion=1&id=" $_POST["id"] . "");
                exit;
            } 
        }
        
        
// Prüfung Content-Type
        
        //Whitelist Content-Type
        
$whitelist_content_type = array('image/jpeg');
        
        
$mime_type_client_bild $_FILES["bild_serie"]["type"][$i];
        
$mime_type_client_bild_vorschau $_FILES["bild_serie_vorschau"]["type"][$i];
        
        
$finfo_bild = new finfo(FILEINFO_MIME);
        
$mime_type_server_bild $finfo_bild->file($_FILES["bild_serie"]["tmp_name"][$i]);
        
        
$finfo_bild_vorschau = new finfo(FILEINFO_MIME);
        
$mime_type_server_bild_vorschau $finfo_bild->file($_FILES["bild_serie"]["tmp_name"][$i]);
        
        if(!
in_array($mime_type_client_bild$whitelist_content_type) || 
            !
in_array($mime_type_client_bild_vorschau$whitelist_content_type) ||
            !
in_array($mime_type_server_bild$whitelist_content_type) ||
            !
in_array($mime_type_server_bild_vorschau$whitelist_content_type))
        {
            
$_SESSION["rueckgabe"] = "Es wurde ein falscher Dateityp gewählt. 
                Bitte nur .jpg oder .jpeg verwenden"
;
            
header("Location: http://xxx/admin_bilder_serie.php?aktion=1&id=" $_POST["id"] . "");
            exit;
        }
        
        
        
// Prüfen ob Bild richtige Größe besitzt
        
if(getimagesize($_FILES["bild_serie"]["tmp_name"][$i]) || 
            
getimagesize($_FILES["bild_serie_vorschau"]["tmp_name"][$i]))
        {
            
$image_size_bild getimagesize($_FILES["bild_serie"]["tmp_name"][$i]);
            
$image_size_bild_vorschau getimagesize($_FILES["bild_serie_vorschau"]["tmp_name"][$i]);
            
            if((
$image_size_bild[0] != 640) || ($image_size_bild[1] != 480) || 
                (
$image_size_bild_vorschau[0] != 160) || ($image_size_bild_vorschau[1] != 120))
            {
                
$_SESSION["rueckgabe"] = "Die größe stimmt nicht überein oder 
                    es wurde ein falscher Datentyp gewählt"
;
                
header("Location: http://xxx/admin_bilder_serie.php?aktion=1&id=" $_POST["id"] . "");
                exit;
            }
        }
        
        echo 
'<p>Test bestanden</p>';
        
    }

}

else
{
    echo 
'<p>es wurde kein Formular gesendet</p>';

Noch kurz etwas zur Ausgangslage:
Es soll über ein Formular mehrere Bilder für eine Slideshow hochgeladen werden, welche aus einem Hauptbild (640 x 480)und einem Vorschaubild (160 x 120) besteht. In dem Beispiel habe ich aber das Formular nur auf ein Bild (also Haupt- und Vorschaubild). Das mit den mehreren Bildern kommt später, ich möchte erst dass das Ding generell funzt, daher nicht über die Schleife wundern.

Kurze Erklärung Code
- zuerst soll überprüft werden, ob das Formular überhaupt gesendet wurde

- dann soll geprüft werden, ob überhaupt Dateien ausgewählt wurden

- dann wird die Endung der Dateien überprüft

- weiter wird der content-Type geprüft

- danach soll die richtige Größe geprüft werden. Ich denke mal damit kann ich auch direkt feststellen, ob es sich überhaupt um ein Bild handelt, denn wenn kein Bild --> keine Maße

Erst dann soll es weiter mit dem Upload gehen.


Das Problem jetzt:
Das Script geht über die Kontrolle ob eine Datei gewählt wurde nicht hinaus. Auch wenn ich ein Bild mit den richtigen Maßen auswähle (Durch Testausgabe überprüft) bleibt es da hängen, obwohl die Bedingungen ja NICHT erfüllt sind und das Script weiter abgearbeitet werden sollte...

Hat jemand einen Tipp woran das liegen könnte?

Besten dank

Lapje

Geändert von Lapje (13.01.2012 um 09:59 Uhr).
  Mit Zitat antworten
Alt 13.01.2012, 00:51  
meikel
Gast
 
Beiträge: n/a
Standard

if (! empty(...
  Mit Zitat antworten
Alt 13.01.2012, 09:03  
Lapje
Gast
 
Beiträge: n/a
Standard

Sorry, Flüchtigkeitsfehler...

Ich habe jetzt das in

PHP-Code:
if (!emtpy($_POST['gesendet'])) 
geändert. Aber generell keine Veränderung. Ich bleibe immer noch an der ersten Whitelist hängen, und da muss es doch "empty" anstatt "!empty" heißen, da er ja nur eine Meldung geben soll, wenn $_FILES NICHT gefüllt, also leer sind, oder?

Also: Wenn leer, dann Meldung...

Und trotzdem geht das Script immer in die Schleife...

NACHTRAG: Ich bin jetzt zumindest soweit, dass ich das Gefühl habe, dass es am $endung im Pregmatch liegt. Gebe ich dort direkt ".jpg" ein, dann funzt es. Das Script lässt sich z.B. auch nicht mit einer bild.jpg.php "überrumpeln" - es wird immer nur nach der Endung geschaut. Wenn ich aber wieder $endung (welche richtig gefüllt sind - durch Testausgabe geprüft) funktioniert es wieder nicht...

Zudem habe ich gelesen, dass empty() Probleme bei Variablen mit einer 0 machen kann, da es dort dann auch eine leere Variable angibt und man deswegen eher isset verwenden soll...was ist da drann?

Auch bei der Überprüfung des Mime-Types hakt es anscheinend wieder an der if-Abfrage. Die Variablen werden anscheinend richtig übermittelt, denn mit einer Prüfabfrage von

PHP-Code:
echo 'Type: ' $mime_type_client_bild '<br />';
                echo 
'Bild Vorschau: ' $mime_type_client_bild_vorschau '<br />';
                echo 
'Type: ' $mime_type_server_bild '<br />';
                echo 
'Bild Vorschau: ' $mime_type_server_bild_vorschau '<br />'
wird

Zitat:
Type: image/jpeg
Bild Vorschau: image/jpeg
Type: image/jpeg; charset=binary
Bild Vorschau: image/jpeg; charset=binary
ausgegeben.

Die Zuteilung scheint zu funzen. Wenn ich jetzt die if-Abfrage nur auf den Client ($mime_type_client_...), beschränke, dann funzt das wunderbar, aber wenn ich es mit dem Server ($mime_type_server_...) versuche, wird der Type anscheinend nicht richtig erkannt...

NACHTRAG: AUch das Problem konnte ich mittlerweile "lösen": Durch

PHP-Code:
$whitelist_content_type = array('image/jpeg''image/jpeg; charset=binary'); 
Wurde anscheinend auch $mime_type_server... überprüft. Es scheint als wenn doch nicht nur nach image/jpeg gesucht wurde.

Aber kann man das so machen? Wenn ja, dann stimmt etwas in dem Script nicht woran ich mich orientiert habe...

Das Script sieht zumindest jetzt so aus:

PHP-Code:
// Prüfen ob Formular gesendet
if (!empty($_POST['gesendet']))
{
    for (
$i=0$i 1$i++)
    {
        
//Prüfen ob Dateien ausgewählt wurden
        
if(empty($_FILES["bild_serie"]["name"][$i]) || 
            empty(
$_FILES["bild_serie_vorschau"]["name"][$i]) || 
            (
$_FILES["bild_serie"]["name"][$i] === '') || 
            (
$_FILES["bild_serie_vorschau"]["name"][$i] === ''))
        { 
            
$_SESSION["rueckgabe"] = "Es wurde keine Datei gewählt";
            
header("Location: 
                http://xxx/admin_bilder_serie.php?aktion=1&id=" 
$_POST["id"] . "");
            exit;
        }
           
        
// Prüfen ob Endung erlaubt
        
        // Whitelist Endung
        
$whitelist_endung = array('.jpg''.jpeg');                
        
        foreach(
$whitelist_endung as $endung)
        {
            if((!
preg_match("/.jpg\$/i"$_FILES['bild_serie']['name'][$i])) 
                || (!
preg_match("/.jpg\$/i"$_FILES['bild_serie_vorschau']['name'][$i])))
            {
                
$_SESSION["rueckgabe"] = "Es wurde ein falscher Dateityp gewählt. 
                Bitte nur .jpg verwenden 1"
;
                
header("Location: 
                    http://xxx/admin_bilder_serie.php?aktion=1&id=" 
$_POST["id"] . "");
                exit;
            } 
        }
        
        
// Prüfung Content-Type
        
        //Whitelist Content-Type
        
$whitelist_content_type = array('image/jpeg''image/jpeg; charset=binary');
        
        
$mime_type_client_bild $_FILES["bild_serie"]["type"][$i];
        
$mime_type_client_bild_vorschau $_FILES["bild_serie_vorschau"]["type"][$i];
        
        
$finfo_bild = new finfo(FILEINFO_MIME);
        
$mime_type_server_bild $finfo_bild->file($_FILES["bild_serie"]["tmp_name"][$i]);
        
        
$finfo_bild_vorschau = new finfo(FILEINFO_MIME);
        
$mime_type_server_bild_vorschau $finfo_bild_vorschau->file($_FILES["bild_serie_vorschau"]["tmp_name"][$i]);

        
        if(!
in_array($mime_type_client_bild$whitelist_content_type) || 
            !
in_array($mime_type_client_bild_vorschau$whitelist_content_type) ||
            !
in_array($mime_type_server_bild$whitelist_content_type) ||
            !
in_array($mime_type_server_bild_vorschau$whitelist_content_type))
        {
            
$_SESSION["rueckgabe"] = "Es wurde ein falscher Dateityp gewählt. 
            Bitte nur .jpg verwenden 2"
;
            
header("Location: 
                http:/xxx/admin_bilder_serie.php?aktion=1&id=" 
$_POST["id"] . "");
            exit;
        }
        
        
        
// Prüfen ob Bild richtige Größe besitzt
        
if(getimagesize($_FILES["bild_serie"]["tmp_name"][$i]) || 
        
getimagesize($_FILES["bild_serie_vorschau"]["tmp_name"][$i]))
        {
            
$image_size_bild getimagesize($_FILES["bild_serie"]["tmp_name"][$i]);
            
$image_size_bild_vorschau getimagesize($_FILES["bild_serie_vorschau"]["tmp_name"][$i]);
            
            if((
$image_size_bild[0] != 640) || ($image_size_bild[1] != 480) || 
            (
$image_size_bild_vorschau[0] != 160) || ($image_size_bild_vorschau[1] != 120))
            {
                
$_SESSION["rueckgabe"] = "Die größe stimmt nicht überein oder es wurde 
                ein falscher Datentyp gewählt"
;
                
header("Location: 
                    http://xxx/admin_bilder_serie.php?aktion=1&id=" 
$_POST["id"] . "");
                exit;
            }
        }
        
        echo 
'<p>Test bestanden</p>';
        
    }

}

else
{
    echo 
'<p>es wurde kein Formular gesendet</p>';


Geändert von Lapje (13.01.2012 um 15:30 Uhr).
  Mit Zitat antworten
Alt 13.01.2012, 14:28  
meikel
Gast
 
Beiträge: n/a
Standard

PHP-Code:
if ( ! emtpy($_POST['gesendet'])) 
Naja, das kennzeichnet das "abgesendete Formular". Nu mußt Du aber auch noch prüfen, ob in $_FILES die gewünschten Indizes enthalten sind, bevor Du eine Schleife startest.
  Mit Zitat antworten
Alt 13.01.2012, 15:16  
Lapje
Gast
 
Beiträge: n/a
Standard

Aber das ganze muss doch in die Schleife, da auf dem Formular 5 Upload-Felder vorhanden sein werden - nur jetzt um das zu testen gibt es nur einen Upload. Klar, ich muss noch eine Kontrolle reinmachen ob alle 5 nicht besetzt - also leeres Formular - oder weniger. Aber die Schleife muss ja damit ich für das jeweilige Feld einen Zähler habe - oder über foreach. Aber es bleibt halt bei einer Schleife...oder nicht?
  Mit Zitat antworten
Alt 13.01.2012, 15:24  
meikel
Gast
 
Beiträge: n/a
Standard

Falscher Ansatz:
Code:
if (Upload == korrekt)
  datei_verwurstung
else
  formularanzeige
Die alleinige Abfrage, ob jemand auf den Submit gehauen hat, reicht nicht aus. Du mußt auch testen, ob überhaupt ein File aufgeschlagen ist.
Kein File - keine Kekse.
  Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
php / mysql Probleme bei Umstieg von php 5.2 auf 5.3 Gerhard76 PHP Einsteiger 10 21.09.2011 12:58
[Erledigt] isset in Datenbankabfrage SELECT nutzen ePole PHP Einsteiger 9 17.01.2011 14:22
[Erledigt] Undefind index trotz isset Sonic PHP Tipps 2010 7 18.09.2010 18:04
Probleme mit Word Lollix Off-Topic Diskussionen 2 26.03.2010 11:52
CHarset und Probleme mit IE KeKs0r HTML, Usability und Barrierefreiheit 10 26.01.2010 21:59
ISSET() einfügen, immer falsche werte Demirci_42 PHP Tipps 2009 7 16.02.2009 19:46
Probleme bei Speicherung von serialize() Strings Manni2k PHP Tipps 2006 13 15.10.2006 15:06
Probleme mit mbstring extension unter Debian HStev Server, Hosting und Workstations 3 30.08.2006 20:55
[Erledigt] hilfe! probleme mit... PHP Tipps 2005 4 12.04.2005 22:55
[Erledigt] Technische Probleme mit Sessions PHP-Fortgeschrittene 4 18.11.2004 14:45
Warum array_key_exists() anstatt isset() bei Arrays? PHP-Fortgeschrittene 0 29.09.2004 17:19
[Erledigt] Probleme mit Fremdsprachen HTML, Usability und Barrierefreiheit 2 21.09.2004 17:11
[Erledigt] Probleme mit isset() und globalen Arrays PHP Tipps 2004 5 24.08.2004 09:50
PHP Bilder in DB / Probleme bei Änderung PHP-Fortgeschrittene 1 05.06.2004 11:20

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
$_files wird nicht gefüllt, php aktion sobald ausgewählt

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:48 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum