copy($_FILES["file"]["tmp_name"], "./Bilder/".$name."_".$_FILES["file"]["name"]."");
Falls du diesen Unterstrich meinst, dieser dient zum Trennen der Name. Beispiel:
ANGEGENER NAME_NAME DER DATEI
Name:
Luise
Bild:
bild.jpg
Luise_bild.jpg
EDIT: Nochmal ohne den Namen:
<?php
session_start();
?>
<html>
<head>
<title>Upload</title>
</head>
<body>
<?php
$key = 0;
if ($_POST["username"] == "Username" AND $_POST["password"] == "Passwort") {
$key = 1;
$_SESSION["username"] = $_POST["username"];
$_SESSION["password"] = $_POST["password"];
}
if ($_SESSION["username"] == "Username" AND $_SESSION["password"] == "Passwort")
$key = 1;
if ($key == 1) {
echo "<p><b>".$_SESSION["username"]."</b>, erfolgreich eingeloggt!</p>";
if ($_FILES["file"]["name"]) {
if ($_FILES["file"]["size"] > 512001)
echo "<p><font color=\"red\">Die Datei darf maximal 500 KB groß sein.</font></p>";
else {
copy($_FILES["file"]["tmp_name"], "./Bilder/".$_FILES["file"]["name"]."");
echo "<p><font color=\"green\">Die Datei wurde erfolgreich hochgeladen.</font></p>";
}
}
echo "<form action=\"upload.php\" enctype=\"multipart/form-data\" method=\"post\">";
echo "<table>";
echo "<tr>";
echo "<td width=\"50\"><b>Datei</b>:</td><td><input type=\"file\" name=\"file\"></td>";
echo "</tr>";
echo "<tr>";
echo "<td></td><td><input type=\"submit\" value=\"Hochladen\"></td>";
echo "</tr>";
echo "</table>";
echo "</form>";
} else {
echo "<form action=\"upload.php\" method=\"post\">";
echo "<table>";
echo "<tr>";
echo "<td width=\"80\"><b>Username</b>:</td><td><input type=\"text\" name=\"username\" value=\"".$_POST["username"]."\" size=\"25\"></td>";
echo "</tr>";
echo "<tr>";
echo "<td><b>Passwort</b>:</td><td><input type=\"password\" name=\"password\" size=\"25\"></td>";
echo "</tr>";
echo "<tr>";
echo "<td></td><td><input type=\"submit\" value=\"Login\"></td>";
echo "</tr>";
echo "</table>";
echo "</form>";
}
?>
</body>
</html>
@marcel: also, direkt nach dem ich eine Session erstellt hab, muß ich doch nicht prüfen, ob eine vorhanden ist --- wann also könnte eine vorhanden sein, wenn ich sie NICHT gerade eben erst erstellt hab? Und die Spielerei mit dem Namen finde ich sehr verwirrend. Wieso sollte man sowas denn machen?
@jörg: Den Unterstrich in $_FILES und anderen Globalvariablen meinte ich nicht (den kenne ich schon), sondern den _ in der Namensspielerei, der zwischen $name und $_FILES[file][name] steht und der offenbar (wenn ich jetzt richtig kapiere) einfach die Datei unter einem umbenannten Namen (mit einem Präfix_ davor) im Zielverzeichnis speichert als abholt (was natürlich bei mir sehr ungünstig wäre, weil ich ja die .php - Dateien selber damit hochladen will, und die sollen bittschön ihre Namen behalten, damit die Webseite dann noch funktioniert)
@ alle : Wie setz ich denn jetzt zumindest da, wo ich selbst können müßte (lokal mit XAMPP) die Schreibrechte für das Verzeichnis?
Wenn ich wenigstens in irgendeiner Umgebung mein Mini-UploadScript ohne Passwortschutz schonmal zum Laufen kriegte, könnte ich mich nämlich endlich dran machen, auch das mit dem Passwordschutz einzubauen und müßte dann nur noch drauf warten, daß ich die nötigen Rechte auch auf dem fremden Server kriege (oder kann ich das auch selbst einstellen, wenn ich mich via FTP eingewählt habe - momentan funktioniert mein UMTS-Internet daheim zum Glück wieder ganz gut...)
Sorry, da hatte ich die Frage mit dem Unterstrich missverstanden ;)
direkt nach dem ich eine Session erstellt hab, muß ich doch nicht prüfen, ob eine vorhanden ist --- wann also könnte eine vorhanden sein, wenn ich sie NICHT gerade eben erst erstellt hab?
WEnn du das Formular zum zweiten Mal aufrufst und du den Session-Cookie in der Zwischenzeit nicht gelöscht hast
Wie setz ich denn jetzt zumindest da, wo ich selbst können müßte (lokal mit XAMPP) die Schreibrechte für das Verzeichnis?
Unter LInux/Unix: Indem du die DAteiattribute für Verzeichnis änderst (mit chmod), das Verzeichnis sollte auch beschreibbar sein.
[quote=Jörg]WEnn du das Formular zum zweiten Mal aufrufst und du den Session-Cookie in der Zwischenzeit nicht gelöscht hast
[\quote]
Auch das ist klar. Aber welchen Grund sollte es geben, das Formular zum 2. Mal aufzurufen?
Ach so, jetzt verstehe ich es langsam.... die Password-Abfrage soll irgendwo in einem vorgeschalteten Formular geschehen, mit dem man dann erst auf das Formular zum Upload kommt, und dann kann ich mehrere Uploads machen, bevor ich irgendwo auf einen Logout-Button klicke das mein Cookie löscht (dafür muß ich mir das mit den Cookies erst noch ankucken, das Konzept kannte ich ja noch nicht).
---
Hm, chmod kenne ich. Probier ich dann mal aus. Also gar nichts in den php-Dateien selber ändern, sondern nur ins Verzeichnis Pics gehen und chmod 777 * (aber das setzt nur alle Dateien, die schon da sind, auf überschreibbar - wie bezieh ich mich auf ein ganzes Verzeichnis? einfach im übergeordneten Verzeichnis chmod 777 verzeichnisname ? ) Aber ich glaub, ich rede jetzt auch wieder von anderen Rechten als du. Es ging mir jetzt darum, daß überhaupt ein Upload (nicht ins Verzeichnis Pics, sondern bereits in dieses temporary Zwischenfile des lokalen Servers) erlaubt wird. Also das, wo du bei sm.ismine.de sagte, ich hätte wohl vom Administrator noch keine Rechte zugewiesen bekommen. Muß ich die mir nicht auch lokal erst selber zuweisen (nicht nur für das Verzeichnis, wo ich etwas reinkopieren will, sondern auch insgesamt, damit der lokale Apache-Server -sowas steckt ja in XAMPP wohl drin- überhaupt über den Browser ansprechbar ist?
Jetzt geht es lokal, nachdem ich
chmod a+x uploadscript.php und
chmod 777 Pics eingegeben habe ! Danke! Ich hatte gedacht, da wär eine größere Sache notwendig !
Hm, wenn ich jetzt ein ganzes Verzeichnis hochladen will, es dafür aber keine Fertigfunktion gibt, dann müßte ich mir doch selbst etwas schreiben können im Stil: Baue ein Array, in das alle Dateinamen des Quellverzeichnisses eingetragen werden. Geh das Array durch und lade alle Dateien hoch.
Da ist jetzt nur die Frage: Wenn das Quellverzeichnis auf dem lokalen Rechner liegt und das Zielverzeichnis auf dem Server, muß ich dann das Array selber händisch erfassen oder gibt es eine Funktion, die ein lokales Verzeichnis durchsuchen kann, auch wenn die Dateien nicht datei1.php , datei2.php etc heißen, sondern aussagekräftigere Namen haben? Dafür wäre ja gerade das Array da, damit man die Dateien DANN als datei[1], datei[2] etc. ansprechen kann...... und in das bereits geschriebene Uploadscript automatisch einfügen kann (bzw. das wär ja dann nicht mehr mittels Formular möglich, das Formular müßte dann den Namen von Quell- und Zielverzeichnis abrufen und dann eben das Array im Quellverzeichnis schon vorfinden? also muß ich es doch vorher per Hand schreiben, am besten gleich bei Erstellung einer Webseite auch eine Liste erstellen, wo alle Dateinamen zugehörigen drinstehen??? Oder geht es einfacher?
@marcel:
copy($_FILES["file"]["tmp_name"], "./Bilder/".$_FILES["file"]["name"]."");
Wieso ist vor /Bilder ein Punkt, also ./Bilder ?
Und wozu ist ganz am Schluß ein ."" ?
Noch eine Frage zur Sicherheit: Von einer .php - Datei kann man sich doch problemlos den Quelltext anzeigen lassen, oder? Wenn also
if ($_POST["username"] == "Username" AND $_POST["password"] == "Passwort")
da mit drinsteht, dann kann doch jeder den geforderten Username und das Paßword über die Quellcode-Ansicht herausbekommen???
Oder wann kriegt man von einer php-Datei den Quellcode und wann nicht?
Von einer .php - Datei kann man sich doch problemlos den Quelltext anzeigen lassen, oder?
Nein, Du siehst nur den (HTML-)Text, den du mit echo/print ausgibst oder was außerhalb von <?php und ?> steht.
[...] dann kann doch jeder den geforderten Username und das Paßword über die Quellcode-Ansicht herausbekommen???
Definitiv nicht. Allerdings ist die Post-Übermittlung eines Klartext-Passworts ohne HTTPs ein Sicherheitsrisiko, weil es von Dritten "abgehört" werden könnte. Entweder Du verwendest HTTPS ab der Login-Seite oder Du verschlüsselt die Passwörter mit einer Hash-Funktion (z.B. SHA1) bereits auf Client-Seite (z.B. mit Javascript) und übermittelst / speicherst / vergleichst nur das gehashte Passwort. Letzteres ist zwar sicherer, aber auch nicht zu 100% unknackbar. Eine Kombination aus beidem wäre das beste, wenn es um Sicherheit geht, kommt man um eine verschlüsselte Verbindung kaum drumrum.
1. Verwendung von https: muß ich da Rücksprache mit dem Hoster halten, oder ist das etwas, was ich selbst einschalten kann?
2. Wenn ich den PHP-Quelltext mal bewußt sichtbar machen will, gibt es da eigentlich eine Möglichkeit?