Upload mit zeile in Datei schreiben
Stefan
- php
0 David Tibbe0 Sascha0 Sönke Tesch
Hallo,
ich habe folgendes Problem:
also ich habe einen Bildupload zusammen mit einem eingabeformular in einer php datei.
jetzt soll zu dem upload eine Datei geschrieben werden, mit dem text für das link (img src...) , das wenn ich also die datei aufrufe das bild drin erscheint.
Also nochmal kurz:
ich lade ein Bild hoch und dazu schreibt er gleiche eine datei in der das bild dann erscheint.
jetzt funktioniert das mit dem dateischreiben nciht ganz nur ich weis nicht warum, hier das ganze script, danke im voraus:
<?php
//in
$dateiname = "galerie.html";
if($was=="doit") {
$size = $bild_size; // Größe der Datei
$name = $bild_name; // Der Originalname
$type = $bild_type; // Der MIME Type der Datei
if(eregi("(jpg|gif|jpeg)$",$name)) {
if($size<20000 AND $size!=0) {
copy($bild,$name); // Kopiert das Bild
rename("$bild","$eingabe.jpg");
echo "Das Bild wurde upgeloadet.<br>";
echo "Größe: ".$size." Byte<br>";
echo "Name: ".$eingabe."<br>";
echo "Ansehen: <a href='$eingabe.jpg'>Hier klicken</a>";
} else {
echo "Datei ist entweder groeßer als 200 KB oder gleich 0 KB";
}
} else {
echo "Falsche Erweiterung/Dateityp/Bildformat: ".$name;
}
} else {
echo "<form action='".$PHP_SELF."' enctype="multipart/form-data" method='post'>";
echo "<input type='hidden' name='was' value='doit'>";
echo "<table>";
echo "<tr>";
echo "<td>Datei</td>";
echo "<td><input type='file' name='bild'></td>";
echo "<td><input type='text' name='eingabe'></td>";
echo "</tr><tr>";
echo "<td> </td>";
echo "<td><input type='submit' value='Hochladen'></td>";
echo "</tr>";
echo "</form></table>";
}
if(isset($text) && $text <> "")
{
$zeile = "<center><img border="0" src="$eingabe.jpg"</center><p>";
$datei = fopen ($dateiname, "w+");
if($datei)
{
$fp = fopen($datei, "w+");
fputs($fp, "$zeile");
fclose($fp);
}
}
?>
Hallo
Nach durchlesen des ganzen langen Codes hab ich doch was gefunden was vielleicht der Fehler sein dürfte
if(isset($text) && $text <> "")
{
$zeile = "<center><img border="0" src="$eingabe.jpg"</center><p>";
$datei = fopen ($dateiname, "w+");
if($datei)
{
$fp = fopen($datei, "w+");
fputs($fp, "$zeile");
fclose($fp);
}
}
?>
Da stimmt ja irgendwas nicht. Bekommst du eine Fehlermeldung?
AFAIK, ddürfte »» $fp = fopen($datei, "w+"); nicht funktionieren, da der erste Parameter ein Dateiname und kein Datei-Zeiger sein muss.
Warum willst du überhaupt die Datei ein zweites Mal öffnen? Du hast sie doch schon offen... Also reicht doch folgender Code:
$datei = fopen ($dateiname, "w+");
if($datei) fputs($datei, $zeile);
@fclose($datei);
Grüße
David
Hallo Stefan,
ich bin zwar noch PHP-Anfänger, aber wenn ich mich recht entsinne, dann müssen die doppelten Anführungszeichen um die Variable $zeile weg.
Sicherlich bringt er dir für die Zeile auch die Fehlermeldung, oder?
if($datei)
{
$fp = fopen($datei, "w+");
fputs($fp, "$zeile");
^^ ^^
fclose($fp);
Schönen Gruß aus München
die knappschaft
ich lade ein Bild hoch und dazu schreibt er gleiche eine datei in der das bild dann erscheint.
jetzt funktioniert das mit dem dateischreiben nciht ganz nur ich weis nicht warum, hier das ganze script, danke im voraus:
if($was=="doit") {
$size = $bild_size; // Größe der Datei
$name = $bild_name; // Der Originalname
$type = $bild_type; // Der MIME Type der Datei
Es ist sehr unklug, auf Formulardaten über globale Variablen zuzugreifen. Auf Grund gravierender Sicherheitslücken wurde diese Möglichkeit bereits vor Monaten abgeschaltet, es kann also sein, daß Du in naher Zukunft sämtliche Skripte umschreiben mußt. Benutze besser gleich $_POST[] (bzw. $HTTP_POST_VARS in alten PHP-Versionen).
copy($bild,$name); // Kopiert das Bild
rename("$bild","$eingabe.jpg");
Warum kopierst Du $bild erst nach $name, um dann gleich anschließend $bild in $eingabe.jpg umzubenennen? Entweder copy() oder rename() ist hier überflüssig.
Und wenn ich Schlaumeier für $eingabe im Formular
/etc/rc.d/S10bla
eingebe? Du übernimmst einfach ungeprüft die Benutzereingabe und erlaubst es somit jedem, Dateien ungehindert irgendwo auf dem Server fallen zu lassen. Hättest Du statt rename() copy() angewendet und nicht .jpg an den Namen angehängt, wäre das einzige Rettungsseil gegen eine komplette Systemzerstörung der Schreibschutz einzelner Systemdateien. Mutig, Mutig..
Schau Dir nochmal an, wie man gesendete Dateien übernimmt, ohne sich etwas unterjubeln zu lassen (Stichwort move_uploaded_file() und is_uploaded_file() sowie basename()).
echo "<form action='".$PHP_SELF."' enctype="multipart/form-data" method='post'>";
echo "<input type='hidden' name='was' value='doit'>";
Warum baust Du noch ein zweites Element nur zur Skriptsteuerung ein? Prüfe doch gleich ob das Element, das Du eigentlich benutzen möchtest, vorhanden ist.
Und zum obigen Thema Sicherheitslücke bzw. unerwünschtes Eigenleben: Wenn ich Dein Skript mit der URL "skript.php?was=doit" aufrufe, lande ich in der Bildspeicherroutine, obwohl ich das Formular gar nicht abgeschickt habe. Hier ist das natürlich kein weiter großes Problem, an anderen Stellen hat man damit schon Passwortsicherungen ausgehebelt.
Also: Stelle besser genau sicher, woher externe Variablen kommen.
echo "<td><input type='file' name='bild'></td>";
echo "<td><input type='text' name='eingabe'></td>";
echo "<td><input type='submit' value='Hochladen'></td>";
Der folgende Teil zum Speichern des Textes gehört zur Bildspeicherung in den if-Block am Anfang des Skriptes.
if(isset($text) && $text <> "")
Da dürfte nach dem Und eine Klammer fehlen. Und woher kommt eigentlich $text? Meinst Du nicht eher das <input>-Teil mit dem Namen "eingabe"? Also:
if (isset($_POST["eingabe"]) && (strlen(trim($_POST["eingabe"]))>0))
{
$zeile = "<center><img border="0" src="$eingabe.jpg"</center><p>";
Zum Schließen von <img> fehlt eine spitze Klammer. Und auch hier gehst Du wieder sehr vertrauensselig vor. Was machst Du, wenn jemand
"><style type=text/css>body {display:none}</style><"
eingibt? Dann steht in Deiner Datei
<center><img border="0" src=""><style type=text/css>body {display:none}</style><""></center><p>
Wohl kaum wünschenswert, obwohl noch harmlos. Man könnte genauso gut mit einer Javascript-Schleife den Browser lahmlegen..
$datei = fopen ($dateiname, "w+");
if($datei)
{
$fp = fopen($datei, "w+");
Daß das doppelt gemoppelter Unfug ist, haben die anderen ja schon geschrieben.
Gruß,
soenk.e