WannaBe OOP Class & Func zum Upload definieren

S

sevY

Hi,

ich beschäftige mich zur Zeit mit dem hochinteressanten Thema OOP und wollte einfach mal überlegen was man so machen kann. Zur eher syntaktischen Übung dachte ich mir folgendes:

Anstatt immer ein langes Skript prozedural zu schreiben, das eine Datei aus einem Formularfeld hochlädt, dachte ich mir, definiere ich eine Klasse mit einer Funktion, die das übernimmt.

Eine uploaded Datei sollte auch immer direkt einen Modus verpasst bekommen, da sie ansonsten zb. in Flash nicht angezeigt werden „könnte“ (ich arbeite ausschließlich mit Flash und nur mit PHP/MySQL für den dynamischen Datenaustausch bzw. solche Admintools wie hier ).


Ich habe mal mein Vorhaben skizziert, aber es geht bestimmt eleganter.

Das ganze ist eine Art Notizblock für zb 3 Leute, die Online für zb eine Namenssuche und ein Logo Ideen festhalten möchte. Wie gesagt geht es hierbei erstmal nur um die Klasse&Funktion.

Das Hauptskript, das das Formular und die Funktionen enthält:

PHP:
<?php
require_once('config.inc.php');
require_once('function.inc.php');
$db_tab='sketchpad';
$date=date('y.m.d');
$imagepath='suggested_logos/';
if($_POST['input']=='insert')
    {
//hier definiere ich Variablen für den Array
    $file_name=$_FILES['suggested_logo']['name'];
    $file_tmpname=$_FILES['suggested_logo']['tmp_name'];
    $file_destination=$imagepath.$file_name;
//hier wird der array definiert, der in die Variable eingesetzt werden soll
    $parameter=array($file_name,$file_tmpname,$file_destination,$file_permission); 
//hier sollte das parameter an die funktion übergeben werden und auf den rückgabewert reagieren
    if(!upload::upload_image($parameter))
        {
        echo"fehler";
        }
    else
        {
        mysql_db_query($db_dbase,"insert into $db_tab (date,text,image,user) VALUES ('$date','$_POST[suggested_name]','$parameter[0]','$_POST[user]')");
        echo"<meta http-equiv=refresh content=\"0; URL=".$_SERVER['PHP_SELF']."\">";
      }
   }    
?>

<html>
<head>
<title>Sketchpad</title>
<link rel="stylesheet" href="default.css">   
<meta http-equiv="content-type" content="text/html"; charset="iso-8859-1"> 
<meta name="robots" content="noindex,nofollow"> 
</head>
<body>
<table width="100%" height="100%" cellspacing="0" cellpadding="0">
    <tr>
        <td align="center" valign="middle">
            <table cellspacing="0" cellpadding="0">
                <tr>
                    <td>
                    <?php
                    echo"
                        <form enctype=multipart/form-data action=".$_SERVER['PHP_SELF']." method=\"post\">
                            <h3>Sketchpad</h3>
                            <hr width=100%><p>
                            <input type=\"hidden\" name=\"input\" value=\"insert\">
                            <input type=\"text\" name=\"suggested_name\" value=\"Namensvorschlag\"><p>
                            <hr width=100%><p>
                            <b>Logovorschlag</b><p>
                            <input type=\"file\" name=\"suggested_logo\"><p>
                            <hr width=100%><p>
                            <b>Author</b><p>
                            <input type=\"radio\" name=\"user\" value=\"Bjo&uml;rn\">Bj&ouml;rn<p>
                            <input type=\"radio\" name=\"user\" value=\"Olaf\">Olaf<p>
                            <input type=\"radio\" name=\"user\" value=\"Yves\">Yves<p>
                            <hr width=100%><p>
                            <input type=\"submit\" value=\"Rock'n'Roll\">
                        </form>
                    ";
                    ?>
                    </td>
                </tr>
            </table>
        </td>
    </tr>
</table>
</body>
</html>

Die function.inc.php, die die Klasse und Funktion enthält.
Wenn ich die Geschichte mit der boolschen Logik korrekt verstanden habe, sollte die Funktion auch an sich so funktionieren.

PHP:
<?php
class upload
    {
    function upload_image($x)
        {
        if(!move_uploaded_file($x['0'],$x['2']))
            {
            return(false);
            }
        else
            {
            if(!chmod($x['2'],$x['3']))
                {
                return(false);
                }
            else
                {
                return(true);
                }
            }      
        }
    }
?>


Zum Schluß noch die config.inc.php, in der auch der mode-value für den chmod(); steht. Ich denke das ist sehr sinnvoll, da das von Server zu Server aufgrund der Konfiguration varriieren kann.


Mein Skript funktioniert so übrigens noch nicht, es ist nur eine Skizze.

Das Problem besteht in diesem Teil.

PHP:
if($_POST['input']=='insert')
    {
//hier definiere ich Variablen für den Array
    $file_name=$_FILES['suggested_logo']['name'];
    $file_tmpname=$_FILES['suggested_logo']['tmp_name'];
    $file_destination=$imagepath.$file_name;
//hier wird der array definiert, der in die Variable eingesetzt werden soll
    $parameter=array($file_name,$file_tmpname,$file_destination,$file_permission); 
//hier sollte das parameter an die funktion übergeben werden und auf den rückgabewert reagieren
    if(!upload::upload_image($parameter))
        {
        echo"fehler";
        }

Ich denke das es nicht sehr elegant gelöst ist und bei der Annahme/Übergabe des Arrays Probleme gibt.


Hat jemand Lust mitzutüffteln?


Liebe Grüße

Yves
 
V0.2

Hier wird zumindest schon mal der Array gebastelt, den man übergeben muss. Assoziativ, so das man in nem Jahr immer noch was damit anfangen kann.
PHP:
<?php
require_once('config.inc.php');
require_once('function.inc.php');
$db_tab='sketchpad';
$date=date('y.m.d');
$imagepath='suggested_logos/';
if($_POST['input']=='insert')
    {
    $file_destination=$imagepath.$file_name;  
    $parameter=array(name => $_FILES['suggested_logo']['name'],tmpname => $_FILES['suggested_logo']['tmpname'],destination => $file_destination,permission => $file_permission); 
    $upload_new = new upload();
    if(!$upload_new->upload_image(&$parameter))
        {
        echo"fehler";
        }
    else
        {
        mysql_db_query($db_dbase,"insert into $db_tab (date,text,image,user) VALUES ('$date','$_POST[suggested_name]','$parameter[0]','$_POST[user]')");
        echo"<meta http-equiv=refresh content=\"0; URL=".$_SERVER['PHP_SELF']."\">";
        }
    unset($replace_new);
    }   
?>

Und die Klasse, die eigentlich nur strukturiert sieht dann so aus:
PHP:
class upload
    {
    function upload_image($x)
        {
        if(!move_uploaded_file($x['tmpname'],$x['destination'].$x['name']))
            {
            return(false);
            }
        else
            {
            if(!chmod($x['destination'],$x['permission']))
                {
                return(false);
                }
            else
                {
                return(true);
                }
            }      
        }
    }

Gerne würde ich das aber mit den anderen Klassen auch realisieren.

Eine Klasse für das Tracking des Dateinamens.
Eine Klasse Replace für das Umbenennen eines eventuell ungültigen Dateinamens.
Eine Klasse für das Uploaden,verschieben,benennen der Datei.
Eine Klasse für die Zugriffsrechte, die neuen Dateien und Zielordner entsprechende Modi verpasst.
Das könnte man doch OOPmäßig alá „eine Kiste weiß nicht was in der anderen drin ist“ kombinieren und entsprechend der boolschen Logik dann ein true oder false aus der Gesamtsumme der Rückgabewerte erhalten und auf Wunsch auch einzelne Rückgabewerte abgreifen und spezielle Fehlermeldungen ausgeben.
Yves
 
Zum 'mitzutüffteln' hab ich so richtig keine Zeit, aber vielleicht ein paar Gedanken zu Deinem Vorhaben: Warum willst Du für jeden Bereich eine eigene Klasse anlegen, das widerspricht doch eigentlich dem OO-Grundprinzip? Dann könnte man das ganze doch auch gleich nur mit Funktionen lösen.

Was Du brauchst - wenn ich das richtig verstehe was du machen willst - wäre ja eine 'class dateisystem' in der dann entsprechend 'function datei_hochladen' und 'function datei_loeschen' und 'function datei_rechte_setzen' (und so weiter) und einige weitere Hilfunktionen vielleicht wie 'function dateiname_pruefen' oder 'function suffix_ermitteln' oder was man sonst so noch braucht bereitgestellt wird.
 
Original geschrieben von stegoe
Warum willst Du für jeden Bereich eine eigene Klasse anlegen, das widerspricht doch eigentlich dem OO-Grundprinzip? Dann könnte man das ganze doch auch gleich nur mit Funktionen lösen.
&nbsp;

Daher ja WannaBe ;) … Nein mal im Ernst, du hast recht. Ich weiß nur noch nicht genau, wie ich das umsetzen soll, daher oben grob der Vorschlag mit den Klassen. Eine einzige Klasse macht natürlich Sinn, gerade wegen der Übergabe der Parameter.

In anderen Foren riet man mir, etwas vorgefertigtes zu nehmen, aber dazu habe ich keine Lust. Ich werde mich mal an die Arbeit begeben und euch hier auf dem Laufenden halten, sofern es was neues gibt. Gerade für meinen derzeitigen Auftrag macht das Sinn…

Liebe Grüße

Yves
 
Zurück
Oben Unten