• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Upload-Script für PDF-Datei

Bernhard

Neues Mitglied
Hallo @ alle,

ich hab da mal ein paar Probleme mit einem Upload-Script:
  • der Upload funktioniert weder lokal mit Xampp, noch online
  • ich hätte gerne einen automatischen Logout (wenn das Browserfenster
    geschlossen wird und mit einer Art Timeout)
  • ideal wäre, wenn schon beim Durchsuchen nur PDF-Dateien angezeigt werden
  • egal wie die Datei heißt, soll sie immer in "liste.pdf" umbenannt werden und
    eine eventuell bereits bestehende gleichnamige Datei überschreiben
  • schön wäre eine Funktion, mit der man Username und Passwort ändern könnte,
    dann wäre es aber unbedingt notwendig, dass geprüft wird, dass das Passwort
    Buchstaben mit Groß- und Kleinschreibung enthält, sowie Zahlen, die nicht
    aufeinander folgen und nicht identisch sind...
ich hoffe, Ihr könnt mir helfen, auch wenn ich von PHP nicht so viel Ahnung habe...

Grüße
Bernhard

PHP:
<?php
session_start();
echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"de\" lang=\"de\">";
?>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title></title>
<meta name="audience" content=" Alle " />
<meta name="robots" content="noindex,follow,noarchive" />
<meta http-equiv="cache-control" content="no-cache" />
<meta name="language" content="de" />
</head>
<body>
<?php
$key = 0;
if ($_POST["username"] == "User" AND $_POST["password"] == "Pass") {
    $key = 1;
    $_SESSION["username"] = $_POST["username"];
    $_SESSION["password"] = $_POST["password"];
}
if ($_SESSION["username"] == "User" AND $_SESSION["password"] == "Pass")
    $key = 1;
if ($_POST["logout"] == true) {
    $key = 0;
    session_destroy();
    }
if ($key == 1) {
    ?>

    <form action="upload.php" method="post" class="upload">
        <input type="hidden" name="logout" value="1" />
        <input type="submit" value="Logout" id="logout" />
    </form>
    <form action="upload.php" enctype="multipart/form-data" method="post" class="upload">
        <fieldset>
            <label>Datei:</label><input type="file" name="file" id="file" size="46" /><br />
            <input type="submit" value="Hochladen" id="submit" />
        </fieldset>
    </form>
    <?php
    if ($_FILES["file"]["name"]) {
        if ($_FILES["file"]["size"] > 512001)
            echo "<span class=\"fehlermeldung\">Die Datei darf maximal 500 KB gro&szlig; sein!</span>";
        else {
            copy($_FILES["file"]["tmp_name"], $_FILES["file"]["liste.pdf"]."");
            echo "<span class=\"meldung\">Die Datei wurde erfolgreich hochgeladen.</span>";
        }
    }
} else {?>
    <form action="upload.php" method="post" class="upload">
        <fieldset>
            <label>Username:</label><input type="text" class="text" name="username" id="username" value="<?php echo htmlentities($_POST['username']); ?>" /><br />
            <label>Passwort:</label><input type="password" class="text" name="password" id="password" /><br />
            <input type="submit" value="Login" id="submit" />
        </fieldset>
    </form><?php
}
?>
</body>
</html>
 
Werbung:
der Upload funktioniert weder lokal mit Xampp, noch online
"funktioniert nicht" ist keine ausreichende Fehlerbeschreibung. Bitte etwas genauer. Was hast Du alles versucht, um herauszufinden, woran es liegt? Werden die richtigen Variablen gefüllt? Kommt überhaupt was an? Gibt es Fehlermeldungen?

ich hätte gerne einen automatischen Logout (wenn das Browserfenster geschlossen wird und mit einer Art Timeout)
Dass das Browserfenster geschlossen wird, bekommst Du am Server nicht mit. Das heißt, Du realisierst das idR so, dass Du Deiner Session eine begrenzte Lebensdauer gibst (5 Minuten) und die 5 Minuten beim Besuch einer Seite jedesmal neu beginnen lässt.

ideal wäre, wenn schon beim Durchsuchen nur PDF-Dateien angezeigt werden
Meines Wissens nicht möglich. Immerhin befindest Du Dich auf einer fremden Festplatte.

egal wie die Datei heißt, soll sie immer in "liste.pdf" umbenannt werden
Dann mach das. Gibt einen richtigen Zielname an und nicht $_FILES["file"]["liste.pdf"], denn das ist natürlich nicht definiert. Der Zielfilename ist "liste.pdf", evtl. noch mit einem Pfad davor.

schön wäre eine Funktion, mit der man Username und Passwort ändern könnte,
Jetzt sind wir aber langsam in einem Bereich, wo man DIch in die Jobbörse schicken sollte.

ich hoffe, Ihr könnt mir helfen, auch wenn ich von PHP nicht so viel Ahnung habe.
Dann heißt es Lernen, lernen, lernen... :-)
 
Das ist ein bischen viel auf einmal.
Prüfe erstmal ob der upload überhaupt funktioniert:
PHP:
$speichern=liste.pdf;
$speichern="liste.pdf";
if($_REQUEST['submit'])
{
move_uploaded_file($_FILES['datei']['tmp_name'], "");
copy($_FILES["file"]["tmp_name"], $speichern);

  if (file_exists($speichern))
  {
  echo "<p><a href=\"$speichern\">liste.pdf</a></p>";
  }
  else
  {
  echo "<p>Datei nicht vorhanden: \"$speichern\"</p>";
  }
}

echo $uploadformular;
Die Bedingungen kannst du hinterher nach und nach einbauen.
 
Zuletzt bearbeitet:
Werbung:
Hallo Efchen,
hallo Neuroleptika,

ich bin ein Stück weitergekommen: lokal funktioniert der Upload jetzt und
die Datei wird umbenannt. Dazu musste ich nur eine Zeile modifizieren.
falsch war:
PHP:
copy($_FILES["file"]["tmp_name"], $_FILES["file"]["liste.pdf"]."");
richtig ist offenbar:
PHP:
move_uploaded_file($_FILES["file"]["tmp_name"], "liste.pdf";
der Upload funktioniert weder lokal mit Xampp, noch online
"funktioniert nicht" ist keine ausreichende Fehlerbeschreibung. Bitte etwas genauer. Was hast Du alles versucht, um herauszufinden, woran es liegt? Werden die richtigen Variablen gefüllt? Kommt überhaupt was an? Gibt es Fehlermeldungen?
Wie gesagt, lokal funktioniert es (wobei keine Überprüfung stattfindet, ob es
tatsächlich eine PDF ist, aber damit muss ich wohl leben), online bekomme ich
zwei Fehlermeldungen:
Warning: move_uploaded_file(liste.pdf) [function.move-uploaded-file]: failed to open stream: Permission denied in /data/home/.../.../.../upload.php on line 110
Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpzFk3Di' to 'liste.pdf' in /data/home/.../.../.../upload..php on line 110
Die Datei wurde erfolgreich hochgeladen.
Edit: habe herausgefunden, dass ich die Rechte auf 0777 setzen muss,
damit bekomme ich keine Fehlermeldung mehr, und die Datei wird hochgeladen.
ich hätte gerne einen automatischen Logout (wenn das Browserfenster geschlossen wird und mit einer Art Timeout)
Dass das Browserfenster geschlossen wird, bekommst Du am Server nicht mit. Das heißt, Du realisierst das idR so, dass Du Deiner Session eine begrenzte Lebensdauer gibst (5 Minuten) und die 5 Minuten beim Besuch einer Seite jedesmal neu beginnen lässt.
Mal sehen, ob ich das schaffe. Wenn nicht, dann kann ja zumindest nicht allzuviel passieren.
Edit: da hab ich auch was gefunden, funktioniert aber nicht:
PHP:
<?php
$key = 0;
$_SESSION["zeit"] = time();
$diff = time() - $_SESSION["zeit"];
if ($_POST["username"] == "User" AND $_POST["password"] == "Pass") {
    $key = 1;
    $_SESSION["username"] = $_POST["username"];
    $_SESSION["password"] = $_POST["password"];
}
if ($_SESSION["username"] == "User" AND $_SESSION["password"] == "Pass")
    $key = 1;
if ($diff > 300) {
    $key = 0;
    session_destroy();
    }
if ($_POST["logout"] == true) {
    $key = 0;
    session_destroy();
    }
if ($key == 1) {
    ?>
Vielleicht hat ja jemand noch einen Tipp? Ich habe es auch schon mit kürzeren
Zeiten versucht, bleibe aber immer eingeloggt.
ideal wäre, wenn schon beim Durchsuchen nur PDF-Dateien angezeigt werden
Meines Wissens nicht möglich. Immerhin befindest Du Dich auf einer fremden Festplatte.
nach dem, was ich so gelesen habe, erschien es mir möglich, dass das für Bilder
ginge. Zumindest habe ich schon herausgefunden, dass man mit PHP überprüfen kann,
ob es sich um eine Bild-Datei oder ein Word-Dokument handelt. Daher sollte es
theoretisch wohl auch möglich sein, zu überprüfen, ob es sich um eine PDF handelt.
Edit: das habe ich hinbekommen:
PHP:
<?php
    if ($_FILES["file"]["name"]) {
        if ($_FILES["file"]["size"] > 512001)
            echo "<span class=\"fehlermeldung\">Die Datei darf maximal 500 KB gro&szlig; sein!</span>";
        elseif ($_FILES["file"]["type"] != "application/pdf")
            echo "<span class=\"fehlermeldung\">Das ist keine PDF-Datei!</span>";
        else {
            copy($_FILES["file"]["tmp_name"], $_FILES["file"]["liste.pdf"]."");
            echo "<span class=\"meldung\">Die Datei wurde erfolgreich hochgeladen.</span>";
        }
    }
} else {?>
klar, dass nur überprüft wird, ob die Datei die Endung .pdf hat, aber was anderes
dürfte wohl auch nicht möglich sein...
egal wie die Datei heißt, soll sie immer in "liste.pdf" umbenannt werden
Dann mach das. Gibt einen richtigen Zielname an und nicht $_FILES["file"]["liste.pdf"], denn das ist natürlich nicht definiert. Der Zielfilename ist "liste.pdf", evtl. noch mit einem Pfad davor.
das ist mir mittlerweile gelungen
schön wäre eine Funktion, mit der man Username und Passwort ändern könnte,
Jetzt sind wir aber langsam in einem Bereich, wo man DIch in die Jobbörse schicken sollte.
da wäre ich auch längst, aber:
  • normale Anfragen werden dort sofort gelöscht
  • das Formular bringt nichts, da ich einen Preis angeben müsste, aber
    nicht weiß, was ich dafür zu bezahlen habe
  • ich habe einmal zwei Leute angeschrieben, die dort ihre Leistungen
    anbieten - da bekommt man noch nicht einmal eine Antwort.
    Ist also Zeitverschwendung
ich hoffe, Ihr könnt mir helfen, auch wenn ich von PHP nicht so viel Ahnung habe.
Dann heißt es Lernen, lernen, lernen... :-)
Ich suche schon länger nach einem Kursanbieter, wo man zuerst mal reinschnuppern kann.
Schließlich sind die Schulungen nicht gerade billig.
Eine 14-tägige Schulung habe ich schon hinter mir, gebracht hat sie kaum was.

Das ist ein bischen viel auf einmal.
Prüfe erstmal ob der upload überhaupt funktioniert:
PHP:
$speichern=liste.pdf;
$speichern="liste.pdf";
if($_REQUEST['submit'])
{
move_uploaded_file($_FILES['datei']['tmp_name'], "");
copy($_FILES["file"]["tmp_name"], $speichern);

  if (file_exists($speichern))
  {
  echo "<p><a href=\"$speichern\">liste.pdf</a></p>";
  }
  else
  {
  echo "<p>Datei nicht vorhanden: \"$speichern\"</p>";
  }
}

echo $uploadformular;
Die Bedingungen kannst du hinterher nach und nach einbauen.
Wo müsste ich das einsetzen?

Ich danke Euch beiden!

Grüße
Bernhard
 
Zuletzt bearbeitet:
Wo müsste ich das einsetzen?
Das sollte nur eine Reduzierung auf das nötigste sein.
Es sollte so wie es da steht Funktionieren.

Ich bin nicht der Hecht in solchen Dingen und habe gehofft es antwortet wer anderes.
klar, dass nur überprüft wird, ob die Datei die Endung .pdf hat, aber was anderes
dürfte wohl auch nicht möglich sein
Mit $_FILES['datei']['type'] Kannst du den Dateityp auch unabhängig von der Dateiendung prüfen.
Ob das soviel sicherer ist weiß ich nicht.
ideal wäre, wenn schon beim Durchsuchen nur PDF-Dateien angezeigt werden
Ich glaube das geht überhaupt nicht.
Du mußt die Datei ja erstmal haben um sie zu prüfen.

Hier mal ohne move_uploaded_file:
PHP:
<?php
$uploadformular="
    <form action=\"upload.php\" enctype=\"multipart/form-data\" method=\"post\" class=\"upload\">
        <fieldset>
            <label>Datei:</label><input type=\"file\" name=\"datei\" id=\"file\" size=\"46\" /><br />
            <input type=\"submit\" name=\"submit\" value=\"Hochladen\" id=\"submit\" />
        </fieldset>
    </form>
";

$speichern="liste.pdf";
if($_REQUEST['submit'])

{
//Werte und Variablen:
$gewuenschter_type="application/pdf";
$max_size="512001";
$userfile_size = $_FILES['datei']['size'];
$userfile_typ = $_FILES['datei']['type'];


//ein möglicher Fehler:
if ($userfile_size > $max_size)
{
$fehler_nr = 1;
$meldung_max_size = "<li>Datei zu groß</li>";
}

//noch ein möglicher Fehler:
if ($userfile_typ != $gewuenschter_type)
{
$fehler_nr = $fehler_nr+1; //Fehler zählen
$meldung_userfile_typ = "<li>Falscher Dateityp</li>";
}

//wenn kein Fehler:
if ($fehler_nr < 1)
{
copy($_FILES["file"]["tmp_name"], $speichern);

//wenn Datei vorhanden:
  if (file_exists($speichern))
  {
  echo "<p><strong>Datei wurde gespeichert:</strong></p>";
  echo "<ul>";
  echo "<li><a href=\"$speichern\">$speichern</a></li>";
  echo "<li>Datei-Typ: $userfile_typ <br />$userfile_size</li>";
  echo "<li>Größe: $userfile_size</li>";
  echo "<li><a href=\"upload.php\">zum Formular</a></li>";
  echo "</ul>";
  }
//wenn Datei nicht vorhanden:
  else
  {
  echo "<p>Datei nicht vorhanden: \"$speichern\"<br />
        <a href=\"upload.php\">zum Formular</a></p>";
  }

}

//Fehlermeldungen:
else
{
echo "<p><strong>Es gab $fehler_nr Fehler:</strong></p>";
echo "<ul>$meldung_max_size $meldung_userfile_typ</ul>";
}
}

//Wenn Formular nicht gesendet:
else
{
echo $uploadformular;
}
?>

Wegen den Echos im php-Script mußt du es in <body> schreiben oder per include dort einfügen.
Ich schreibe normalerweise kein echo in php-Scripte.

Erst wenn das so funktioniert würde ich mich um das Login und die SESSIONs kümmern.
Unbefugte brauchen nicht einmal das Formular sehen.

Upload-Scripte würde ich immer von Experten gegenlesen lassen wenn es nicht nur für den Kunden selbst gedacht ist.

Je nachdem was du vorhast, könnte der gleichbleibende Dateiname ein Problem werden (cache).
Ich Verwende immer einen neuen Dateinamen.
 
Zuletzt bearbeitet:
Hallo Neuroleptika,

da hast Du Dir ja die Nacht um die Ohren geschlagen... - Danke!
Das sollte nur eine Reduzierung auf das nötigste sein.
Es sollte so wie es da steht Funktionieren.

Ich bin nicht der Hecht in solchen Dingen und habe gehofft es antwortet wer anderes.
Besser als ich bist Du da auf jeden Fall!
Mit $_FILES['datei']['type'] Kannst du den Dateityp auch unabhängig von der Dateiendung prüfen.
Ob das soviel sicherer ist weiß ich nicht.
Ich hab meinen Beitrag gestern mehrfach editiert, dadurch ist er ziemlich unübersichtlich geworden...

Seit gestern funktioniert:
  • der Upload inklusive Umbenennen und Speichern
  • die Überprüfung mit ($_FILES["file"]["type"] != "application/pdf")
    wobei ich davon ausgegangen bin, dass sich diese nur an der Endung orientiert
    => lässt sich ja einfach testen, indem ich eine txt-Datei umbenenne und hochlade
ideal wäre, wenn schon beim Durchsuchen nur PDF-Dateien angezeigt werden
Ich glaube das geht überhaupt nicht.
Du mußt die Datei ja erstmal haben um sie zu prüfen.
Gut, damit kann ich leben...
Hier mal ohne move_uploaded_file:
PHP:
<?php
$uploadformular="
    <form action=\"upload.php\" enctype=\"multipart/form-data\" method=\"post\" class=\"upload\">
        <fieldset>
            <label>Datei:</label><input type=\"file\" name=\"datei\" id=\"file\" size=\"46\" /><br />
            <input type=\"submit\" name=\"submit\" value=\"Hochladen\" id=\"submit\" />
        </fieldset>
    </form>
";

$speichern="liste.pdf";
if($_REQUEST['submit'])

{
//Werte und Variablen:
$gewuenschter_type="application/pdf";
$max_size="512001";
$userfile_size = $_FILES['datei']['size'];
$userfile_typ = $_FILES['datei']['type'];


//ein möglicher Fehler:
if ($userfile_size > $max_size)
{
$fehler_nr = 1;
$meldung_max_size = "<li>Datei zu groß</li>";
}

//noch ein möglicher Fehler:
if ($userfile_typ != $gewuenschter_type)
{
$fehler_nr = $fehler_nr+1; //Fehler zählen
$meldung_userfile_typ = "<li>Falscher Dateityp</li>";
}

//wenn kein Fehler:
if ($fehler_nr < 1)
{
copy($_FILES["file"]["tmp_name"], $speichern);

//wenn Datei vorhanden:
  if (file_exists($speichern))
  {
  echo "<p><strong>Datei wurde gespeichert:</strong></p>";
  echo "<ul>";
  echo "<li><a href=\"$speichern\">$speichern</a></li>";
  echo "<li>Datei-Typ: $userfile_typ <br />$userfile_size</li>";
  echo "<li>Größe: $userfile_size</li>";
  echo "<li><a href=\"upload.php\">zum Formular</a></li>";
  echo "</ul>";
  }
//wenn Datei nicht vorhanden:
  else
  {
  echo "<p>Datei nicht vorhanden: \"$speichern\"<br />
        <a href=\"upload.php\">zum Formular</a></p>";
  }

}

//Fehlermeldungen:
else
{
echo "<p><strong>Es gab $fehler_nr Fehler:</strong></p>";
echo "<ul>$meldung_max_size $meldung_userfile_typ</ul>";
}
}

//Wenn Formular nicht gesendet:
else
{
echo $uploadformular;
}
?>
Wegen den Echos im php-Script mußt du es in <body> schreiben oder per include dort einfügen.
Ich schreibe normalerweise kein echo in php-Scripte.
Warum?
Ich mache das so, wie ich es für übersichtlicher halte, als Alternative kenne ich nur:
PHP:
 ?>
normales html
<?php
Erst wenn das so funktioniert würde ich mich um das Login und die SESSIONs kümmern.
Unbefugte brauchen nicht einmal das Formular sehen.
Wie gesagt, das funktioniert. Das einzige, was nicht funktioniert, ist das automatische
Beenden der Session nach einer bestimmten Zeit.

Außerdem sind zwei neue Fragen aufgetaucht:
  • ich wollte die Datei eigentlich in die oberste Ebene speichern, habe jetzt
    aber doch einen separaten Ordner angelegt (der aus Sicherheitsgründen
    aber nicht "uploaded-files" o.ä. heißt => es soll niemand auch nur ahnen
    können, dass es irgendwo einen Upload gibt), da ich nicht der obersten
    Ebene die erweiterten Rechte (0777) geben wollte - ist das sinnvoll?
  • so, wie es jetzt funktioniert, kommt bei "else" die Meldung, dass der Upload
    erfolgreich war => das ist eigentlich Blödsinn, da ja immer irgendetwas schiefgehen
    kann... - da scheint Deine Lösung besser zu sein...
Unbefugte sehen das Formular im Normalfall nicht. Es gibt keinen Link dorthin
und es bekommt auch einen nicht per Try-and-Error herauszufindenden Dateinamen.
Daher könnte ich notfalls auch damit leben, wenn ich das mit dem TimeOut wirklich
nicht hinbekomme.
Upload-Scripte würde ich immer von Experten gegenlesen lassen wenn es nicht nur für den Kunden selbst gedacht ist.

Je nachdem was du vorhast, könnte der gleichbleibende Dateiname ein Problem werden (cache).
Ich Verwende immer einen neuen Dateinamen.

Leider kenne ich keinen Experten.
Beabsichtigt ist folgendes: es soll in unregelmäßigen Abständen eine Liste mit
zum Verkauf stehenden Geräten hochgeladen werden. Diese ist in einer statischen
HTML-Seite verlinkt.
Für den gleichbleibenden Dateinamen gibt es mehrere Gründe:
  • die Verlinkung aus der statischen HTML-Seite
  • die Datei soll die vorhergehende überschreiben, um keinen unnötigen Müllberg
    auf dem Server entstehen zu lassen
  • die Datei soll von Google indiziert werden, steht also auch in der Sitemap
Würde ich jedesmal einen neuen Dateinamen verwenden, müsste ich bei jedem
Upload irgendwie die alte Datei löschen, den Link zur Datei ändern, die Sitemap
ändern und mittels .htaccess von der alten zur neuen Datei weiterleiten (d.h.
mittels PHP in die .htaccess schreiben) => da wäre ich vollständig überfordert...

Ansonsten gefällt mir die Idee mit dem neuen Dateinamen sehr gut!

Viele Grüße
Bernhard

Hier nochmal der aktuelle Stand (genaugenommen der von gestern):
PHP:
<?php
session_start();
echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"de\" lang=\"de\">";
?>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title></title>
<meta name="audience" content=" Alle " />
<meta name="robots" content="noindex,follow,noarchive" />
<meta http-equiv="cache-control" content="no-cache" />
<meta name="language" content="de" />
</head>
<body>
<?php
$key = 0;
$_SESSION["zeit"] = time();
$diff = time() - $_SESSION["zeit"];
if ($_POST["username"] == "User" AND $_POST["password"] == "Pass") {
    $key = 1;
    $_SESSION["username"] = $_POST["username"];
    $_SESSION["password"] = $_POST["password"];
}
if ($_SESSION["username"] == "User" AND $_SESSION["password"] == "Pass")
    $key = 1;
if ($diff > 300) {
    $key = 0;
    session_destroy();
    }
if ($_POST["logout"] == true) {
    $key = 0;
    session_destroy();
    }
if ($key == 1) {
    ?>

    <form action="upload.php" method="post" class="upload">
        <input type="hidden" name="logout" value="1" />
        <input type="submit" value="Logout" id="logout" />
    </form>
    <form action="upload.php" enctype="multipart/form-data" method="post" class="upload">
        <fieldset>
            <label>Datei:</label><input type="file" name="file" id="file" size="46" /><br />
            <input type="submit" value="Hochladen" id="submit" />
        </fieldset>
    </form>
    <?php
    if ($_FILES["file"]["name"]) {
        if ($_FILES["file"]["size"] > 512001)
            echo "<span class=\"fehlermeldung\">Die Datei darf maximal 500 KB gro&szlig; sein!</span>";
        elseif ($_FILES["file"]["type"] != "application/pdf")
            echo "<span class=\"fehlermeldung\">Das ist keine PDF-Datei!</span>";
        else {
            move_uploaded_file($_FILES["file"]["tmp_name"], "liste.pdf";
            echo "<span class=\"meldung\">Die Datei wurde erfolgreich hochgeladen.</span>";
        }
    }
} else {?>
    <form action="upload.php" method="post" class="upload">
        <fieldset>
            <label>Username:</label><input type="text" class="text" name="username" id="username" value="<?php echo htmlentities($_POST['username']); ?>" /><br />
            <label>Passwort:</label><input type="password" class="text" name="password" id="password" /><br />
            <input type="submit" value="Login" id="submit" />
        </fieldset>
    </form><?php
}
?>
</body>
</html>
 
Werbung:
Code:
$_SESSION["zeit"] = time();
$diff = time() - $_SESSION["zeit"];
Ich verstehe das nicht so richtig.
Was würde
Code:
echo $diff;
denn ausgeben?

Warum?
Ich mache das so, wie ich es für übersichtlicher halte, als Alternative kenne ich nur: ?>
normales html
<?php
Ich bin immer froh wenn ich den den php-Teil hinter mir habe.

Ich mag Ausgaben in Scripten nicht. Wenn das Script keine echo / print enthält wird auch nichts ausgegeben wenn das Script einzeln aufgerufen wird.
Anstelle von echo ""; kann man auch alles erstmal in Variablen speichern und erst in html > body ausgeben.
z.B:
Code:
echo $uploadformular;
Das ist aber keine Regel und es handhabt jeder anders.
 
Zuletzt bearbeitet:
Hallo Neuroleptika,

Code:
$_SESSION["zeit"] = time();
$diff = time() - $_SESSION["zeit"];
Ich verstehe das nicht so richtig.
Was würde
Code:
echo $diff;
denn ausgeben?
Eigentlich logisch...
Da hab ich mir jetzt tagelang die Finger wund gegoogelt, bis ich was gefunden habe,
das funktioniert.

Ich bin immer froh wenn ich den den php-Teil hinter mir habe.
Ich auch, wobei ich glaube, dass PHP Spaß machen würde, wenn ich es könnte...

Ich mag Ausgaben in Scripten nicht. Wenn das Script keine echo / print enthält wird auch nichts ausgegeben wenn das Script einzeln aufgerufen wird.
Anstelle von echo ""; kann man auch alles erstmal in Variablen speichern und erst in html > body ausgeben.
z.B:
Code:
echo $uploadformular;
Das ist aber keine Regel und es handhabt jeder anders.

Hmmm, ich finde es bisher meist übersichtlicher, wenn alles in einer Datei steht
(Ausnahme: wenn ich den selben Code in unterschiedlichen Dateien brauche...).
Daran, dass nichts ausgegeben wird, wenn ein Script ohne echo oder print aufgerufen
wird, habe ich noch nicht gedacht. Ist aber logisch...

Da es offenbar immer wieder die Frage nach Upload-Scripten gibt und es wirklich
schwierig war, einen funktionierenden automatischen Logout zu finden, hier das
fertige Script:
PHP:
<?php
session_start();
echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"de\" lang=\"de\">";
?>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title></title>
<meta name="audience" content=" Alle " />
<meta name="robots" content="noindex,follow,noarchive" />
<meta http-equiv="cache-control" content="no-cache" />
<meta name="language" content="de" />
</head>
<body>
<?php
$key = 0;
if (isset ($_SESSION["zeit"])) {
    $diff = time() - $_SESSION["zeit"];
}
if ($_POST["username"] == "User" AND $_POST["password"] == "Pass") {
    $key = 1;
    $_SESSION["username"] = $_POST["username"];
    $_SESSION["password"] = $_POST["password"];
}
if ($_SESSION["username"] == "User" AND $_SESSION["password"] == "Pass")
    $key = 1;
if ($diff > 300) {
    $key = 0;
    session_destroy();
    } else {
    $_SESSION["zeit"] = time();
    }
if ($_POST["logout"] == true) {
    $key = 0;
    session_destroy();
    }
if ($key == 1) {
    ?>

    <form action="upload.php" method="post" class="upload">
        <input type="hidden" name="logout" value="1" />
        <input type="submit" value="Logout" id="logout" />
    </form>
    <form action="upload.php" enctype="multipart/form-data" method="post" class="upload">
        <fieldset>
            <label>Datei:</label><input type="file" name="file" id="file" size="46" /><br />
            <input type="submit" value="Hochladen" id="submit" />
        </fieldset>
    </form>
    <?php
    if ($_FILES["file"]["name"]) {
        if ($_FILES["file"]["size"] > 512001)
            echo "<span class=\"fehlermeldung\">Die Datei darf maximal 500 KB gro&szlig; sein!</span>";
        elseif ($_FILES["file"]["type"] != "application/pdf")
            echo "<span class=\"fehlermeldung\">Das ist keine PDF-Datei!</span>";
        else {
            move_uploaded_file($_FILES["file"]["tmp_name"], "liste.pdf";
            echo "<span class=\"meldung\">Die Datei wurde erfolgreich hochgeladen.</span>";
        }
    }
} else {?>
    <form action="upload.php" method="post" class="upload">
        <fieldset>
            <label>Username:</label><input type="text" class="text" name="username" id="username" value="<?php echo htmlentities($_POST['username']); ?>" /><br />
            <label>Passwort:</label><input type="password" class="text" name="password" id="password" /><br />
            <input type="submit" value="Login" id="submit" />
        </fieldset>
    </form><?php
}
?>
</body>
</html>
Grüße
Bernhard

P.S.:
  • die Überprüfung mit ($_FILES["file"]["type"] != "application/pdf")
    wobei ich davon ausgegangen bin, dass sich diese nur an der Endung orientiert
    => lässt sich ja einfach testen, indem ich eine txt-Datei umbenenne und hochlade
Das habe ich jetzt auch mal getestet:
  • falsch benannte PDF wird nicht hochgeladen
  • als PDF benannte Bilddatei wird hochgeladen, kann aber natürlich nicht angezeigt werden
D.h. die Überprüfung mit ($_FILES["file"]["type"] != "application/pdf") orientiert sich ausschließlich an der Endung.
 
Zuletzt bearbeitet:
P.S.: [/LIST]Das habe ich jetzt auch mal getestet:
  • falsch benannte PDF wird nicht hochgeladen
  • als PDF benannte Bilddatei wird hochgeladen, kann aber natürlich nicht angezeigt werden
D.h. die Überprüfung mit ($_FILES["file"]["type"] != "application/pdf") orientiert sich ausschließlich an der Endung.
Schade.
Oder hast du vielleicht die Datei mit einem anderen Dateityp gespeichert.
Ist das auch so wenn du die Datei nur umbenennst?

PHP:
$_SESSION["zeit"] = time();
$diff = time() - $_SESSION["zeit"];
Das habe ich nun doch begriffen.
Eine gute Idee.
 
Zuletzt bearbeitet:
Werbung:
Zitat von Bernhard
P.S.:
[/list]Das habe ich jetzt auch mal getestet:
  • falsch benannte PDF wird nicht hochgeladen
  • als PDF benannte Bilddatei wird hochgeladen, kann aber natürlich nicht angezeigt werden
D.h. die Überprüfung mit ($_FILES["file"]["type"] != "application/pdf") orientiert sich ausschließlich an der Endung.
Schade.
Oder hast du vielleicht die Datei mit einem anderen Dateityp gespeichert.
Ist das auch so wenn du die Datei nur umbenennst?
Hallo Neuroleptika,

ich hatte einmal ein Bild genommen und nur die Dateiendung in .pdf geändert
=> wird hochgeladen...
Dann habe ich eine PDF genommen und die Dateiendung in .txt geändert
=> wird nicht hochgeladen...

PHP:
$_SESSION["zeit"] = time();
$diff = time() - $_SESSION["zeit"];
Das habe ich nun doch begriffen.
Eine gute Idee.

Wobei das so noch nicht funktionieren konnte: es muss die Zeit seit dem letzten
Klick berechnet werden (funktioniert in der Version von Samstag)...

Grüße
Bernhard
 
Hallo Neuroleptika,

ich hatte einmal ein Bild genommen und nur die Dateiendung in .pdf geändert
=> wird hochgeladen...
Dann habe ich eine PDF genommen und die Dateiendung in .txt geändert
=> wird nicht hochgeladen...



Wobei das so noch nicht funktionieren konnte: es muss die Zeit seit dem letzten
Klick berechnet werden (funktioniert in der Version von Samstag)...

Grüße
Bernhard
Ja.
PHP:
//wenn session vorhanden:
if (isset ($_SESSION["zeit"]))
{
    $diff = time() - $_SESSION["zeit"];
}

//ansonsten:
else
{
    $_SESSION["zeit"] = time();
}

Ich habe $_FILES['datei']['type'] auch mit verschiedenen Dateiendungen ausprobiert. Hatte die gleichen Ergebnisse.
Ich weiß nicht wie das besser geht und ob es überhaupt ein Sicherheitsproblem ist.
 
Ja.
PHP:
//wenn session vorhanden:
if (isset ($_SESSION["zeit"]))
{
    $diff = time() - $_SESSION["zeit"];
}

//ansonsten:
else
{
    $_SESSION["zeit"] = time();
}
Hallo Neuroleptika,

ja, so habe ich es in meiner Version vom Samstag - hab ewig gegoogelt, bis ich
einen Schnipsel gefunden habe, den ich anpassen konnte...

Edit: Dein Code ist anders als meiner! - Das haut nicht hin, weil Du $_SESSION["zeit"]
nur neu setzt, wenn es noch nicht gesetzt war, damit werde ich grundsätzlich nach
fünf Minuten ausgeloggt, egal ob ich aktiv war oder nicht...

Ich habe $_FILES['datei']['type'] auch mit verschiedenen Dateiendungen ausprobiert. Hatte die gleichen Ergebnisse.
Ich weiß nicht wie das besser geht und ob es überhaupt ein Sicherheitsproblem ist.

Ich denke nicht, dass es ein Sicherheitsproblem sein kann (falls jemandem eines
einfallen sollte, bitte laut schreien! :-) ), denke da eher an Schutz für den DAU,
der u.U. glaubt, er hätte eine PDF hochgeladen, nachdem er eine .txt umbenannt
hat. Testen werde ich noch, ob die Datei-Prüfung case-sensitive ist.

Ich bin ja PHP-Noob, könnte mir am ehesten vorstellen, dass es besser geht, wenn
man zuerst die Dateiendung löscht, dann die Datei prüft und sie dann entweder
neu benennt oder eben die Fehlermeldung ausgibt. Muss aber ehrlich sagen, dass
ich momentan keinen Nerv mehr habe, das Script weiter zu verbessern...

Grüße
Bernhard
 
Zuletzt bearbeitet:
Werbung:
Edit: Dein Code ist anders als meiner! - Das haut nicht hin, weil Du $_SESSION["zeit"]
nur neu setzt, wenn es noch nicht gesetzt war, damit werde ich grundsätzlich nach
fünf Minuten ausgeloggt, egal ob ich aktiv war oder nicht...
..

Die session soll ja nicht bei jeden Aufruf neu gesetzt werden.
Sonst würde ja alles immer wieder bei null beginnen.
Ich habe es so eingebaut:
Code:
if ($username=="jens" and $password=="neuroleptika" or $_SESSION["berechtigt"] == 1)
{

$_SESSION["berechtigt"] = 1;
if (isset ($_SESSION["zeit"]))
{
    $diff = time() - $_SESSION["zeit"];
//echo "<p><strong>diff gesetzt</strong></p>";
}
else
{
    $_SESSION["zeit"] = time();
  // echo "<p><strong>session gesetzt</strong></p>";
}
}
In $_SESSION["berechtigt"] habe ich gespeichert ob der Login erfolgreich war.

Muss aber ehrlich sagen, dass
ich momentan keinen Nerv mehr habe, das Script weiter zu verbessern...
Ehrlich gesagt ich auch nicht.

Die Session verfällt sowiso wenn die Sitzung beendet wurde .
 
Zuletzt bearbeitet:
Hallo Neuroleptika,

Die session soll ja nicht bei jeden Aufruf neu gesetzt werden.
Sonst würde ja alles immer wieder bei null beginnen.
O.K., bei mir beginnt es mit jedem Durchlauf bei Null. Das wollte ich aber so.
So hat auch der DAU eine Chance, der siebenmal die falsche Datei hochgeladen
hat und ich hab's einfacher, wenn ich das Formular mal so abändern möchte, dass
man mehrere Dateien hochladen kann...
Ich habe es so eingebaut:
Code:
if ($username=="jens" and $password=="neuroleptika" or $_SESSION["berechtigt"] == 1)
{

$_SESSION["berechtigt"] = 1;
if (isset ($_SESSION["zeit"]))
{
    $diff = time() - $_SESSION["zeit"];
//echo "<p><strong>diff gesetzt</strong></p>";
}
else
{
    $_SESSION["zeit"] = time();
  // echo "<p><strong>session gesetzt</strong></p>";
}
}
In $_SESSION["berechtigt"] habe ich gespeichert ob der Login erfolgreich war.
Das hab ich in $key

Muss aber ehrlich sagen, dass
ich momentan keinen Nerv mehr habe, das Script weiter zu verbessern...
Ehrlich gesagt ich auch nicht.

Die Session verfällt sowiso wenn die Sitzung beendet wurde .

Klar...

Jetzt fällt mir nochwas auf: auch wenn's funktioniert, möchte ich es ja ordentlich
machen, müsste ich nicht eigentlich zu Anfang $diff = 0; setzen?

Grüße
Bernhard
 
Wenn es $diff nicht gibt wird die Bedingung nicht erfüllt:
PHP:
if ($diff > 300) {
    $key = 0;
    session_destroy();
    }
In Javascript müßtet du die Variable zu Beginn anlegen.
Bei php ist das egal.
 
Werbung:
Hallo,

ich benutze auch dieses Skript hier, das hat nun einige Zeit wunderbar funktioniert, aber auf einmal erhalte ich jedesmal die Meldung "Das ist keine PDF Datei". Obwohl es eine *.pdf datei ist! (und auch diese dateiendung hat).

An was könnte das den liegen? Irgendeine Einstellung am Server?

Wenn ich die Überprüfung des Dateityps auskommentiere funktioniert (logischerweise) alles wie es soll:

PHP:
elseif ($_FILES["file"]["type"] != "application/pdf")
            echo "<span class=\"fehlermeldung\">Das ist keine PDF-Datei!</span>";
in der mime.types steht "application/pdf pdf" auch drin, daran sollte es wohl nicht liegen?

Mod-Edit: Doppelpost zusammengefasst - Macht es dir Spaß, verfaulende Themen wieder auszugraben und den Zersetzungsprozess zu stören? (XraYSoLo)
 
Zuletzt bearbeitet von einem Moderator:
mit dem IE funktioniert alles wie es soll, aber Firefox macht an zwei verschiedenen PCs Probleme. da $_FILES["file"]["type"] ja vom Browser kommt, nehme ich mal an Firefox verbockt da irgendwas bei den mime-types... nur was? und warum auf einmal? Oo
 
Mod-Edit: ...Macht es dir Spaß, verfaulende Themen wieder auszugraben und den Zersetzungsprozess zu stören?
Was ist dir denn über die Leber gelaufen?
Der letzte Beitrag ist vom 17.03. Woher soll ein neuer Benutzer wissen wann der "Zersetzungsprozess" beginnt?
Oder das hier Beiträge überhaupt "verfaulen" sollen ?



mit dem IE funktioniert alles wie es soll, aber Firefox macht an zwei verschiedenen PCs Probleme. da $_FILES["file"]["type"] ja vom Browser kommt, nehme ich mal an Firefox verbockt da irgendwas bei den mime-types... nur was? und warum auf einmal? Oo
Ich hatte mal eine pdf zugeschickt bekommen mit der es sich genauso verhielt.
Ich habe dann eine neue pdf-Datei ertellt die dann korrekt erkannt wurde.
Woran es lag weiß ich nicht.
 
Zuletzt bearbeitet:
Werbung:
Was ist dir denn über die Leber gelaufen?
Der letzte Beitrag ist vom 17.03. Woher soll ein neuer Benutzer wissen wann der "Zersetzungsprozess" beginnt?
Oder das hier Beiträge überhaupt "verfaulen" sollen ?




Ich hatte mal eine pdf zugeschickt bekommen mit der es sich genauso verhielt.
Ich habe dann eine neue pdf-Datei ertellt die dann korrekt erkannt wurde.
Woran es lag weiß ich nicht.

sehr seltsam, wenn ich die selbe datei mit dem IE oder mit Opera hochlade, klappt es wunderbar, mit FF auf zwei verschiednenen PCs seit mitte April nicht mehr..
 
Mod-Edit: ...Macht es dir Spaß, verfaulende Themen wieder auszugraben und den Zersetzungsprozess zu stören?
Was ist dir denn über die Leber gelaufen?
Der letzte Beitrag ist vom 17.03. Woher soll ein neuer Benutzer wissen wann der "Zersetzungsprozess" beginnt?
Oder das hier Beiträge überhaupt "verfaulen" sollen ?

Da stimme ich voll und ganz zu, zumal sich jemand, der antworten möchte, viel
leichter tut, nachzuschauen, welche Probleme das Script eventuell vorher schon
gemacht hat.
Leute, die über Suchmaschinen kommen, erfahren aus einem zusammenhängenden
Thread, welche Probleme eventuell auf sie zukommen könnten usw.

Grüße
Bernhard
 
Zurück
Oben