PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Upload von Dateien


thorben
02.12.2004, 17:41:13
Hello Selfphp-Forum,

ich habe Probleme mit einem Upload-Script, was eigentlich laufen sollte (erfolgreich getestet), allerdings wird es durch eine Fehlermeldung abgebrochen.

Hier das kompette Script:


if (isset($_POST['senden'])==true)
{
$extlimit = "yes"; //Do you want to limit the extensions of files uploaded
$limitedext = array(".gif",".jpg",".png",".jpeg"); //Extensions you want files uploaded limited to.
$sizelimit = "yes"; //Do you want a size limit, yes or no?
$sizebytes = "1000000"; //size limit in bytes
if($senden){
if($bilddatei!= "") {
if (($sizelimit == "yes") && ($bilddatei_size > $sizebytes)) {
echo "Die Bilddateiname ist zu gross, sie darf mamimal $sizebytes bytes sein.";
}
$ext = strrchr($bilddatei_name,'.');
if (($extlimit == "yes") && (!in_array($ext,$limitedext))) {
echo "Die Bilddateiname hat nicht die richtige Endung.";
}
//Der Ordner images liegt auf dem Server, dort werde die Bilder kopiert.
//falls im images Ordner der Name der Bilddatei schon existiert, dann soll eine Fehlermeldung kommen.
elseif (file_exists("images/$bilddatei_name")) {
echo "Die Bilddateiname existiert bereit. Bitte ändere deine Bilddateiname und versuche es nochmal.";
}
//ansonsten wird die Datei im Ordner images kopiert
else{
copy($bilddatei,"images/$bilddatei_name");
} }//if($bilddatei!= "") {
}//if($senden)


//Daten speichern
$count = "0";
$datum = date("d.m.Y");
$guestfile="../data/news.csv";
$auswahl=$_POST["namen"];
$bild01 = $bilddatei;
$bild02 = "0";
$bild03 = "0";
$bild04 = "0";
$bild05 = "0";
$bild06 = "0";
$bild07 = "0";
$bild08 = "0";
$bild09 = "0";
$bild10 = "0";

if(file_exists($guestfile)){
$datei=fopen($guestfile,"r");
$guest_data=fread($datei,filesize($guestfile));
fclose($datei);
}

$datei=fopen($guestfile,"w");
flock($datei,1);
$longtext = str_replace("n", "<br>", $langtext);
fputs($datei,"$head|$kurztext|$langtext|$datum|$bild01|$bild02|$bild03|$bild04|$bild 05|$bild06|$bild07|$bild08|$bild09|$bild10|$countn");

if (isset($guest_data));
fputs($datei,$guest_data);
flock($datei,3);
fclose($datei);

header("Location:index.php?sent=weiter");
exit;
}


Das Formular sieht folgendermaßen aus.


<form action='xxx.php' method='post'>
<u>Überschrift</u><i><input name='head' class='feld' type='text'></i>
<br><img src='../img/ecblank.gif' height='6'><br>
<u>Kurztext</u><i><input name='kurztext' class='feld' type='text'></i>
<br><img src='../img/ecblank.gif' height='6'><br>
<u>Langtext</u><i><textarea name='langtext' class='feld2'></textarea></i>
<br><img src='../img/ecblank.gif' height='6'><br><br><br><br><br><br><br>
<u>1. Bild</u><i><input type='file' name='bilddatei' value='durchsuchen'></i><br><br><br>
<input type='submit' class='submitx' NAME='senden' VALUE='SENDEN'>
</form>



Ich bekomme folgende Meldung:
"Die Bilddateiname hat nicht die richtige Endung."
Meiner Meinung hat das was mit meiner Ordnerstruktur zu tun, verrückterweise sind die Ordner vorhanden.
Und die Schreibweisen sind richtig.

1. Muss man bei der Ordnerstruktur etwas beachten, als nur den richtigen Pfad?
2. In welcher Variable finde ich den Dateinamen? (Hab mir das schon mal mit echo ausgeben lassen, leider ist der Dateiname nirgendwo vorhanden)
3. Wie kann ich das Script so umstellen, dass ich mehrere Uploads realisieren kann?

Gruß thorben.

xabbuh
03.12.2004, 15:05:25
Welche php-Version nutzt du? Ist register globals bei dir eingeschaltet? Wenn nicht kannst du nämlich nicht direkt auf $bildatei zugreifen, sondern musst das $_FILES Array nutzen.

thorben
03.12.2004, 17:20:05
Hi Xabbuh und selfphp-Forum,
inzwischen habe ich mir ein Script zusammengesucht und meinen Bedürfnissen angepasst. Sorry, das von gestern war/ist Mist.

Jetzt habe ich etwas neues vorliegen:

Quellcode: http://www.php.thorbenkuehl.de/upload.txt
Zum Testen: http://www.php.thorbenkuehl.de/upload4.php

Wie immer möchte ich etwas in Dateien speichern und als DB
missbrauchen. Diesmal geht es darum, Bildnamen mit Dateityp
(bildname.typ) zu speichern. Das Hochladen funktioniert einwandfrei. Leider haut das "herausfiltern" der Bildnamen nicht
hin. Die zweite foreach-Schleife soll die Dateinamen durchlaufen und in die Variable $super speichern. Schon die Ausgabe mit echo funktioniert nicht.

Was ist mein Fehler? Welchen besseren Lösungsansatz gibt es hierfür?

xabbuh
03.12.2004, 18:58:41
Benutze statt $HTTP_POST_VARS $_POST und $_FILES und dann kannst du $_FILES durchlaufen. Außerdem muss $super ein Array sein, wenn du dort mehr als einen Dateinamen speichern willst. Es sei denn du hängst die Namen aneinader. Davon rate ich aber ab.

<?php
$super = array();
foreach($_FILES as $name => $row) {
$super[] = $row['name'];
}
?>


Wenn du dir jetzt anschauen willst, was alles in dem Array gespeichert ist, benutze entweder print_r() (http://www.php.net/print_r) oder var_dump() (http://www.php.net/var_dump):

<?php
print '<pre>';
print_r($super);
print '</pre>';

// bzw.

print '<pre>';
var_dump($super);
print '</pre>';
?>

thorben
03.12.2004, 20:10:18
Hello,
ich hab mein Script mal angepasst:

$super = array();
foreach($_FILES as $name => $row) {
$super[] = $row['name'];
}
print_r($super);

Die Ausgabe ist: Array ( [0] => bussi.jpg [1] => super.jpg )

Mmmh, ich will die Dateien am liebsten mit "|" getrennt ausgeben,
so dass ich diese anschließend gleich in meine txt-Datei speichern kann, but how?

Gruß thorben.

xabbuh
03.12.2004, 21:38:38
Dann wendest du einfach nach der Schleife noch implode() (http://www.php.net/implode) an:

<?php
$super = implode('|', $super);
?>

thorben
03.12.2004, 21:59:35
Ok vielen Dank, das ist soweit klar - ich hab's begriffen.

Jetzt stoße ich allerdings auf das nächste Problem:
Jede Zeile, die ich speichere, hat fest vorgegebene Felder:
x|y|z|bild1| ... |bild10

Bis jetzt schreibt er aber nur diejenigen Bildnamen in die Zeile, die auch wirklich hochgeladen wurden, nicht die, welche hochgeladen werden können, und da jede Zeile eine feste Anzahl an Feldern hat, passt es noch nicht so ganz.

Ich habe mal folgendes versucht:



...
$super = implode('|', $super);
$bild1 = $super[0];
$bild2 = $super[1];
$bild3 = $super[2];
$bild4 = $super[3];
$bild5 = $super[4];
$bild6 = $super[5];
$bild7 = $super[6];
$bild8 = $super[7];
$bild9 = $super[8];
$bild10 = $super[9];
...


Damit kommt ein sehr witziges, aber ungewolltes Ergebnis raus:
d|a|t|e|i|n|a|m|e|.|j|p|g| (als Beispiel)

Generell soll man 10 Bilder hochladen können, was ja auch
funktioniert - somit sollen in die Felder, sofern man weniger als 10
Bilder hochlädt, "Nullen" geschrieben werden -> die Anzahl der
der Felder soll stetig gleich bleiben (damit das auslesen nicht so
kompliziert wird).

Wie kann ich das lösen?

Gruß thorben.

xabbuh
04.12.2004, 11:53:18
Original geschrieben von thorben
Damit kommt ein sehr witziges, aber ungewolltes Ergebnis raus:
d|a|t|e|i|n|a|m|e|.|j|p|g| (als Beispiel)
Das ist nicht wirklich verwunderlich. Nachdem du implode angewandt hast, ist $super nämlich wieder ein String. Somit werden dann einfach nur die Zeichen an der Stelle ausgegeben.

Zu deinem Problem: Benenne am besten die Formularfelder fortlaufen (z.B. bild1, bild2, ..., bild10). Dann kannst du die Namen der Bilder sehr leicht über eine Schleife in ein Array speichern:

<?php
$super = array();
for($i = 1; $i <= 10; $i++) {
$super[] = $_FILES['bild' . $i]['name'];
}
?>

thorben
04.12.2004, 12:04:43
Sehr leicht ist gut - ich habe gerade überhaupt keinen Plan, wo das
Codesegment hin soll - ich habe noch mal den bis jetzt unveränderten
Quelltext bereit gestellt:

http://www.php.thorbenkuehl.de/upload.txt

Danke. thorben.

xabbuh
04.12.2004, 16:57:58
Die Stelle, die ich dir in meinem letzten Beitrag geschrieben habe, setzt du an Stelle dieser hier:

<?php
$super = array();
foreach($_FILES as $name => $row) {
$super[] = $row['name'];
}
?>

thorben
05.12.2004, 13:54:51
Hallo,

mmmh, jetzt speichert keine Dateien mehr.

Das aktuelle Script sieht folgendermaßen aus:
http://www.php.thorbenkuehl.de/upload2.txt

Zum ausprobieren:
http://www.php.thorbenkuehl.de/upload4.php

Gruß thorben.

xabbuh
05.12.2004, 14:48:52
Warum nimmst du das Array $HTTP_POST_FILES und nicht $_FILES?

thorben
05.12.2004, 16:02:03
Jetzt habe ich $_FILES genommen, aber das hat auch keine
Auswirkungen.
Ich muss ehrlich sagen, dass ich ein wenig den Faden verloren habe.

:-) thorben.

xabbuh
05.12.2004, 20:36:14
- Ist $sendfiles gesetzt?
- Wird die foreach-Schleife überhaupt ausgeführt?
- Ist $arrPostFiles['size'] bei jedem Schleifendurchlauf größer als 0?