Problem mit Upload-Formular - IE und Firefox

Die sollten eigentlich nebeneinander stehen. Aber wenn kein Platz mehr da ist wirds eben untereinander angezeigt. Also entweder mehr Platz schaffen oder den buttons kleinere Werte zuweisen. Zum Bleistift nur upload bzw. löschen

Mit der Grafik - keine Ahnung, wohl wieder ein Bug vom IE

Moin,

*.gif-Dateien sollten ohne Probleme auch im IE funktionieren (Schreibweise überprüfen und den Validator die Seite auf Fehler suchen lassen).

Reset-Buttons halten die meistens eher für unnötig, d.h. du kannst den auch einfach weglassen :smiley:

MfG
myPages

@hummer
ja scheint so aber im Moment klappt das.Muß das aber nochmal prüfen.

@myPages
ja hast recht, eigentlich ist so ein Reset-Button unnütz. Hab den einfach weggelassen.

So, langsam wird es ja was mit meinem Formular. Trotzdem habe ich noch ein paar Problemchen. Dateien in einen anderen Ordner verschieben klappt soweit schon mal, jetzt möchte ich diese Dateien auch anzeigen lassen und habe dafür folgenden Code verwendet:

[code]<?php
// tabelle
echo “<table border=“0” cellspacing=“0” cellpadding=“0”>\n”;

echo “<tr style=“font-weight:bold;”>\n”;
echo " <td style=“width:200px;color:#ffffff;font-size:10pt;”>Dateiname\n";
echo " <td style=“width:200px;color:#ffffff;font-size:10pt;”>Größe in KB\n";
echo " <td style=“width:200px;color:#ffffff;font-size:10pt;”>Upload am\n";
echo “\n”;

// fuer alle .jpg bilder zB sowas:
// foreach(glob(".jpg") as $datei){
foreach(glob("{.zip,.rar,.7z,.pdf,.jpg,.jpeg,.mp3,.wav,.doc,.xls,.html,.htm}", GLOB_BRACE) as $datei) {

// groesse
$groesse = filesize($datei)/1024;

// letzte aenderung
$aenderung = date("d.m.y, H:i:s", filemtime($datei));

if($i%2 == 0) {
  echo "<tr>\n";
} else {
  echo "<tr style=\"background-color:#000000; color:#000000\">\n";
}
  echo "  <td style=\"width:200px;font-size:8pt;\"><a href=\" " .$datei . "\">" . $datei . "</a></td>\n";
  echo "  <td style=\"width:200px;font-size:8pt;color:#ffffff;\">".round($groesse, 2)."</td>\n";
  echo "  <td style=\"width:200px;font-size:8pt;color:#ffffff;\">" . $aenderung . "</td>\n";
  echo "</tr>\n";

$i++;

}

echo “\n”;
?>[/code]

Nun wird mir natürlich nichts angezeigt, das das Script wohl den Pfad noch nicht kennt. Wenn ich jetzt bei foreach(glob("{.zip,.rar,.7z,.pdf,.jpg,.jpeg,.mp3,.wav,.doc,.xls,.html,.htm}", GLOB_BRACE) as $datei) hinter dem " den Ordnerpfad angebe, dann wird auch der Inhalt angezeigt, allerdings als komplette Pfadangabe (Beispiel:./test/datei.zip). Hätte es aber lieber das nur die Datei (Beispiel: Datei.zip) angezeigt wird und nicht der Pfad in welchem Ordner sich diese befindet. Wo muß ich die Pfadangabe nun hinschreiben damit das entsprechend funktioniert?

Was mir auch noch zusätzlich fehlt, wäre ein Script, welches mir eine eMail sendet, in der drin steht das der User X am “Datum” die Datei “Dateiname” um “Uhrzeit” heruntergeladen hat. Wie kann ich das realisieren? Die Dateien bleiben nicht immer drauf, das heißt die eMail müßte dynamisch generiert werden können, je nach dem welche Datei angeklickt wurde zum herunterladen. Interessant wäre auch noch als kleinen Zusatz eine Anzeige, wo man sehen kann wie oft diese Datei schon heruntergeladen wurde eventuell in Verbindung mit dem User Namen sowie Datum und Uhrzeit. Kann man sowas noch zusätzlich realisieren?

Need Codeschnipsel… :wink:

Moin,

grundsätzlich helfen dir da die Dateisystem-Funktionen von PHP weiter. Insbesondere auch is_dir() , is_readable() , dir() und basename(). Du kannst auch ./test/ z.B. per substr() entfernen.

Ansonsten würde ich mal ausprobieren, was bei foreach("./test/".glob(…usw…)) passiert.

Eine E-Mail zu versenden kannst du recht simpel per mail() erledigen, wobei du dann natürlich halt angebene muss, wie der Nutzer, etc. ermittelt wird und diese dann in den Text reinpacken.

Man kann leider nicht 100%tig angeben, wie oft die Dateien runtergeladen wurden, da es ja z.B. auch Download-Abbrüche mitgezählt würden. Aber prinzipiell kann man das mit einer *.txt-Datei lösen, die z.B. so aufgebaut ist:

{dateiname}|x
{dateiname2}|x2
...

{dateiname} = Name der Datei
| = Trennungszeichen
x = Anzahl der Downloads

Auch hier helfen dir die Dateisystem-Funktionen weiter.

MfG
myPages

Also wenn ich foreach("./test/".glob("{.zip,.rar,.7z,.pdf,.jpg,.jpeg,.mp3,.wav,.doc,.xls,.html,.htm}", GLOB_BRACE) as $datei) eingebe, dann bekomme ich folgende Fehlermeldung:

Warning: Invalid argument supplied for foreach() in C:\Programme\xampp\htdocs\testserver\inhalt_check.php on line 15

Line 15 ist genau diese Zeile. Dieses substr() wo muß ich das einfügen? Muß da noch was dahinter?

Geh mal eben wieder googeln… :smiley: oder Tip von dir???

Wenn die Ausgabe ./test/datei.endung ist, dann

echo "  <td style=\"width:200px;font-size:8pt;\"><a href=\" " .$datei . "\">" . substr($datei, 7) . "</a></td>\n";

Achso, das muß nach echo. Was substr macht hab ich dank deiner Links verstanden. Zumindest die Funktion welche dadurch ausgeführt werden soll nur das zusammensetzen und die Zusammenhänge machen mir noch relativ große Probleme. Da hab ich ja noch viel zu lernen.

Erkläre mir bitte mal warum in dem Code die Zahl 7 vorkommt. Was bewirkt die bzw. wo kommt diese her?

Ich glaube die Lösung ist mir gerade klar geworden. Bedeutet die 7 die Anzahl der verwendeten Zeichen? Also beispielsweise ./test/ sind wenn ich richtig zähle genau 7 Zeichen. Wenn das Verzeichnis jetzt ./download/ heissen würde, müßte eine 11 eingetragen werden. Ist das richtig so? Hab ich das richtig interpretiert?

Mit der Funktion mail() muß ich mir noch mal genauer anschauen. Das mit dem Download zählen wird so aber vermutlich nicht gehen, da ich ja vorher nicht weiß welche Datei upgeloadet worden ist. Ich möchte also das der Dateiname automatisch eingebunden wird, da ich keine festen Dateien zum downloaden habe.

Hoffe ich habe mich richtig ausgedrückt.

Das mit der 7 hast du fast richtig erfasst. der Zweite Parameter in substr() ist der Offset (Startposition), an dem der “unterstring” herausgeschnitten werden soll.
Der dritte parameter (hier nicht angegeben) wäre dann die Länge, wie viele Zeichen herausgeschnitten werden sollen, wird der nicht angegeben, dann nimmt er alle Zeichen bis zum Ende.

um die Position vom letzten “/” zu ermitteln, kann man strrpos() nutzen (nicht zu verwechseln mit strpos).


Alternativ kann man auch den Dateinamen einfach mit preg_replace oder so ermitteln

Beispiel:

Moin,

Balmung hat dich ja bereits über ein paar Feinheiten aufgeklärt, daher erspare ich mir weiteres zu strpos & Co :wink:

Das mit der *.txt-Datei funktioniert, sofern du die Uploadnamen in diese Datei einträgst, was du bequem beim Upload erledigen kannst.

Wenn dann jemand die Datei runterlädt, kannst du automatisch dem Namen suchen lassen in der *.txt-Datei und den Zähler dort um 1 erhöhen, sodass du einen simplen Download-Counter hast.

Im Umkehreffekt heisst es natürlich auch, dass du dir aus dieser txt-Datei Anzeigen wie “Diese Datei wurde schon X mal runtergeladen.” bauen kannst - oder auch insgesamt y (x1+x2+…xn) Downloads.

D.h. die Reihenfolge funktioniert so:

[Action:Upload]
> Datei hochladen
> Dateinamen in die *.txt-Datei schreiben und den x Wert auf 0 setzen
[Action]
> Datei runterladen
> x-Wert von der Datei innerhalb der *.txt-Datei um 1 erhöhen
[Action:Anzeige]
> Text-Datei auslesen und Werte für den/die Downloads ausgeben

Im Endeffekt hast du so 3 Segmente, die wunderbar mit ein ander kooperieren. Der Vorteil ist auch, dass alles auf Basis der von Dateien funktioniert, sodass auch z.B. ein Ausfall von Datenbanken (was auch eine Möglichkeit wäre Up- und Downloads zu steuern) dich nie betreffen wird.

Wenn du dich mehr in PHP einarbeiten willst, würde ich dieses Tutorial empfehlen. Natürlich kannst du gerne weiterhin Fragen stellen :wink:

MfG
myPages

@Balmung,
also der 2.te Parameter ist die Startposition aber heisst diese immer 7 oder woher kommt diese Zahl? Wenn das nicht die Zeichen sind, wie muß ich mir das sonst vorstellen? Bekomme gerade den logischen Bezug nicht hin. Habs noch nicht so ganz verstanden…

@myPages
danke das ich mich hier weiter “durchfragen” kann und darf. In vielen anderen Foren wird man leider meist nur abgewimmelt und mit den Problemchen allein gelassen. Irgendwie muß man das ja lernen und wenn das lesen nicht hilft zu verstehen, dann sollte man auch fragen stellen können bei Leuten die einem das etwas verständlicher erklären. Und das ist hier einfach nur klasse. Vielen Dank dafür und vor allem für die Geduld. :sunglasses:

Ich werde mir mal das Tutorial anschauen, denn ich habe noch ein 2.tes Projekt welches ich nach dem Formular in Angriff nehmen möchte. Ich denke am besten lernt man sowas, wenn man es erstellt, also “Learning by doing”

Man kann sagen, es ist die Anzahl Zeichen, die übersprungen werden sollen.
Es ist natürlich nicht immer 7. wie du mit deinem anderen Beispiel “./download/” schon recht hattest, müsste es in diesem Fall 11 sein.
Ermitteln mit strrpos:

strrpos ermittelt hier die Position des LETZTEN auftretenden Schrägstrichs, im String $datei.
Weiter nutzen kannst du das dann direkt in substr:

Wobei wir + 1 machen müssen, damit wir den Schrägstrich nicht mit ausschneiden.


Edit: und wenn wir das alles ein bisschen schicker machen, mit einer zusätzlichen Abfrage, ob der Schrägstrich überhaupt gefunden wurde, schauts in etwa so aus:

$pos = strrpos($datei, '/') === false ? 0 : strrpos($datei, '/') + 1;
$dateiname = substr($datei,$pos);

mfg Balmung

Morgen zusammen, so habe das Script ja bisher nur lokal getestet und bis jetzt tauchen keine Fehler mehr auf. Zumindest lokal. Hab jetzt alles auf den bplaced-Server gelegt und wenn ich die index.php aufrufe, dann steht in dem Feld wo die Uploads aufgeführt werden folgendes:

Warning: Invalid argument supplied for foreach() in /users/mitgliedsname/www/upload/user2/inhalt_check.php on line 17

Line 17 ist das hier:

Man sieht den Fehler aber nur, wenn der Ordner leer ist. Sobald ich eine Datei rauflade ist dieser Fehler weg. Woran liegt das? Ich kann nichts falsches finden???

Desweiteren hätte ich noch gerne das mir die Dateien nach Upload-Datum sortiert werden. Hab gelesen daß es irgendwie mit sort() gehen soll nur hab ich noch nicht herausgefunden wo und vor allem wie ich das eingeben muß.

Was mir auch noch gefallen würde, wäre die Anzeige in KB,MB,GB hab auch einiges an Code dazu gefunden, kann das aber nicht umsetzen wie und wo ich das rein setzen muß. Bisher nutze ich folgendes:

// groesse $groesse = filesize($datei)/1024;

Sind halt ein paar Schönheitsfehler…

Moin,

die Warnung bezieht sich darauf, dass foreach() für Arrays gedacht ist, da aber wenn keine Datei vorhanden ist, kein Array existiert, spuckt PHP eine Warnung aus. Brauchst dir also keinen Kopf deswegen machen.

Wenn es dich zu sehr stört, schreib ein @ vor foreach, das unterdrückt Warnungen, aber auch Fehlermeldungen, daher sollte man damit vorsichtig umgehen :wink:

Mit sort() kannst du Arrays sortieren lassen, d.h. du müsstest sort auf ein Array mit den einzelnen Dateien anwenden bzw. auch auf deren Uploaddatum.

Was die einzelnen Bytes angeht: filesize liefert die Dateigröße in Bytes
1 Kilobyte sind 1024 Byte
1 Megabyte sind 1024 Kilobyte bzw. 1024*1024 Byte
1 Gigabyte sind 1024 Megabyte usw.

Wenn du also die Byte-Anzahl erhälst und durch 1024 teilst, erhälst du die KB Anzeige …

MfG
myPages

Wenn ich ein @ vor foreach setze dann bekome ich eine parse-Fehler:

Mit der Sortierung muß ich mich wohl noch etwas beschäftigen.

Aaah… man man man, jetzt habe ich schon soviele Änderungen vorgenommen und nun klappt der Mail-Versand nicht mehr. Woran liegt das nun? Ich habe in der Richtung bisher nichts verändert. Kann da mal jemand drüber schauen?

function.php

[code]<?php

// Einstellungen für das Script
$AdminPasswort = “passwort”; // Upload Passwort
$AdminEmail = “adminemail”; // Admin Email
$PfadZumScript = “http://pfadzumscript/upload/user2/”; // Komplette Webadresse zum Script
$Dateiendungen = array( “zip”, “rar”, “7z”, “pdf”, “jpg”, “jpeg”, “gif”, “mp3”, “wav”, “mid”, “doc”, “xls”, “html”, “htm”, “ufo”); // erlaubte Dateiendungen
$StandardBetreff = “Eine neue Datei von User 2”; // Standardbetreff falls kein Betreff im Formular angegeben wurde
$Upload = “./files/”;

// Email auf Format pruefen
function checkEmail( $email )
{
$nonascii = “\x80-\xff”;
$nqtext = “[^\\$nonascii\015\012”]";
$qchar = “\\[^$nonascii]”;
$normuser = ‘[a-zA-Z0-9][a-zA-Z0-9_.-]’;
$quotedstring = “”(?:$nqtext|$qchar)+"";
$user_part = “(?:$normuser|$quotedstring)”;
$dom_mainpart = '[a-zA-Z0-9][a-zA-Z0-9._-]
\.’;
$dom_subpart = ‘(?:[a-zA-Z0-9][a-zA-Z0-9._-]\.)’;
$dom_tldpart = ‘[a-zA-Z]{2,5}’;
$domain_part = “$dom_subpart$dom_mainpart$dom_tldpart”;
$pattern = “$user_part@$domain_part”;

if (!preg_match( "/^$pattern$/", $email ))
{
    return FALSE;
}
else
{
    return TRUE;
}

}

// DownloadLink fuer den Mailbody
function getDownloadLink( $DownloadHash )
{
global $PfadZumScript;
return <<<DOWNLOADLINK

Der nachfolgende Abschnitt wurde automatisch generiert.

{$_FILES[‘datei’][‘name’]} wurde von User 2 auf Ihren Server geladen.

DOWNLOADLINK;
}

// Maximale Uploadgroesse ermitteln
function PHPINIWertUmwandeln( $Groesse )
{
$Werte[‘MB’] = 1048576;
$Werte[‘Mb’] = 1048576;
$Werte[‘M’] = 1048576;
$Werte[‘m’] = 1048576;
$Werte[‘KB’] = 1024;
$Werte[‘Kb’] = 1024;
$Werte[‘K’] = 1024;
$Werte[‘k’] = 1024;

while (list( $Schluessel ) = each( $Werte ))
{
    if ((strlen( $Groesse ) > strlen( $Schluessel )) && (substr( $Groesse, strlen( $Groesse ) - strlen( $Schluessel )) == $Schluessel ))
    {
        $Groesse = substr( $Groesse, 0, strlen( $Groesse ) - strlen( $Schluessel ) ) * $Werte[$Schluessel];
        break;
    }
}
return $Groesse;

}

function UploadmoeglichkeitPruefen()
{
$Uploadmoeglichkeit = TRUE;
if (strtolower( @ini_get( ‘file_uploads’ ) ) == ‘off’ || @ini_get( ‘file_uploads’ ) ==0)
{
$Uploadmoeglichkeit = FALSE;
}
return $Uploadmoeglichkeit;
}

function MaximaleDateiuploadGroesseErmitteln()
{
$MaximaleDateiuploadGroesse = 0;
if ($Dateigroesse = ini_get( ‘upload_max_filesize’ ))
{
$MaximaleDateiuploadGroesse = PHPINIWertUmwandeln( $Dateigroesse );
}
if ($Postgroesse = ini_get( ‘post_max_size’ ))
{
$Postgroesse = PHPINIWertUmwandeln( $Postgroesse );
if ($Postgroesse < $MaximaleDateiuploadGroesse)
{
$MaximaleDateiuploadGroesse = $Postgroesse;
}
}
return $MaximaleDateiuploadGroesse;
}

function UploadLimit()
{
if (UploadmoeglichkeitPruefen())
{
$MaximaleDateiuploadGroesse = MaximaleDateiuploadGroesseErmitteln();
echo “<span style=“color: #FFFFFF; font-size: 0.8em; font-weight: normal;”>(max. Dateigröße: " .number_format( $MaximaleDateiuploadGroesse / 1024, 0, “,”, “.” ). " KB)”;
}
}

// HAUPTSCRIPT BEGINNT HIER

if (isset( $_GET[‘aktion’] ) )
{
switch ($_GET[‘aktion’])
{
// Neue Datei hochladen
case ‘senden’:
if (isset( $_POST[‘send_file’] ) &&
$_POST[‘admin_passwort’] == $AdminPasswort &&
$_FILES[‘datei’][‘size’] > 0 !== false)
{
// Maskierung entfernen
if (get_magic_quotes_gpc())
{
$_POST = array_map( ‘stripslashes’, $_POST );
}
// Pruefen ob die Dateiendung erlaubt ist
$UploadDateiEndung = array_pop( explode( “.”, strtolower( $_FILES[‘datei’][‘name’] ) ) );
if(!in_array( $UploadDateiEndung, $Dateiendungen ))
{
$DateiERROR = true; die( include(“error.php”) );
}

            // Dateiendung ok
            $ersetzen = array( 'ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue', 'ß' => 'ss', ' ' => '_' );
            $DateiNameNeu = strtr( strtolower( $_FILES['datei']['name'] ), $ersetzen );
            $DownloadHash = md5( $DateiNameNeu );
            $umask_alt = umask( 0 );
            if(file_exists($DateiNameNeu))   {
                    $FileERROR = true;
                }
	else  // Upload

             if (@move_uploaded_file( $_FILES['datei']['tmp_name'], $Upload.$DateiNameNeu ))
            {
                // Mail Header
                $MailHeader  = "From:{$AdminEmail}<{$AdminEmail}>\n";
                $MailHeader .= "MIME-Version: 1.0\r\n";
                $MailHeader .= "Content-Type: text/html\n";
                $MailHeader .= "Content-Transfer-Encoding: 8bit\n";
                                     $MailHeader .= "Message-ID: <" .time(). " noreply@" .$_SERVER['SERVER_NAME']. ">\r\n";
                $MailHeader .= "X-Mailer: PHP v" .phpversion(). "\r\n";
                // Mail Betreff
                $MailBetreff = strlen( $_POST['mail_betreff'] ) > 3 ? htmlspecialchars( $_POST['mail_betreff'] ) : $StandardBetreff;
                // Mail Body
                $MailBody  = nl2br( htmlspecialchars( $_POST['mail_text'] ) );
                $MailBody .= getDownloadLink( $DownloadHash );
                if (!@mail ( $AdminEmail, $MailBetreff, $MailBody, $MailHeader ))
                {
                    $MailSendFehler = true;
                }
                // CHMOD setzen
                @chmod( $DateiNameNeu, 0755 );
                umask( $umask_alt );
                header( 'location: ' .$_SERVER['PHP_SELF']. '?status=UploadOK' );
            }
            else // Upload-Fehler
            {
                umask( $umask_alt );
                header( 'location: ' .$_SERVER['PHP_SELF']. '?status=UploadERROR' );
            }
        }
        elseif ($_POST['admin_passwort'] != $AdminPasswort)
        {
            $PasswortERROR = true;
        }

    break;

}
}

?>[/code]

Gibt es eigentlich auch einen PHP-WYSIWYG Editor? Würde glaube ich vieles einfacher machen bzw. würde sicherlich auch zum Verständnis beitragen.

Du nutzt im $MailHeader oft “\n” als Zeilenumbruch.
Wenn ich mich nicht irre muss es genau wie beim HTTP ein CRLF sein, d.h. nach jeder Header Zeile MUSS “\r\n” stehen.

\r = CR = Carriage Return
\n = LF = Line Feed

So ist es im SMTP vorgeschrieben.
Vielleicht liegt ja da der Fehler

mfg Balmung

Hab ich gerade ausprobiert geht leider trotzdem nicht. Es wird keine mail versendet. Vorher ging das verstehe das gar nicht.

nehm sonst mal das @ vor mail() weg und schau ob dann eine Fehlermeldung erscheint, mit der man was anfangen kann.
wenn keine erscheint, dann schreib in dein script:

irgendwo oben oder so.
und schau ob das Script dann ein Fehler ausspuckt.

mfg Balmung

Oh, oh, oh… hab mal deinen Schnipsel eingesetzt und es kommen voll viele Meldungen.

[code]Notice: Undefined variable: DateiERROR in /users/mitgliedsname/www/upload/user2/meldungen.php on line 3

Notice: Undefined variable: FileERROR in /users/mitgliedsname/www/upload/user2/meldungen.php on line 4

Notice: Undefined index: status in /users/mitgliedsname/www/upload/user2/meldungen.php on line 5

Notice: Undefined index: status in /users/mitgliedsname/www/upload/user2/meldungen.php on line 6

Notice: Undefined variable: PasswortERROR in /users/mitgliedsname/www/upload/user2/meldungen.php on line 7

Notice: Undefined variable: MailSendFehler in /users/mitgliedsname/www/upload/user2/meldungen.php on line 8

Notice: Undefined variable: DownloadERROR in /users/mitgliedsname/www/upload/user2/meldungen.php on line 10

Notice: Undefined variable: i in /users/mitgliedsname/www/upload/user2/inhalt_check.php on line 25

Notice: Undefined variable: i in /users/mitgliedsname/www/upload/user2/inhalt_check.php on line 35


Notice: Undefined index: mail_text in /users/mitgliedsname/www/upload/user2/index.php on line 142
[/code]

Da scheint wohl jetzt ein dicker Fehler drin zu sein… :uhoh:

die Fehler undefined variable und so sind “normal” und dürfen ignoriert werden. Probleme würde es wohl nur geben, wenn register_globals aktiviert wäre ^^
Um diese kleinen “Fehlerchen” zu vermeiden, nimmst du die Namen der Variablen und gibts ihm am anfang deines Scriptes einen Standardwert.

jedenfalls sieht man auch, dass “mail_text” nicht existiert.
$MailBody = nl2br( htmlspecialchars( $_POST[‘mail_text’] ) );
‘mail_text’ existiert nicht. Formular überprüft? bzw ist es nicht besser einen festen Text und auch einen festen Betreff zu nehmen, statt diese per POST zu übermitteln?

mfg Balmung