PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem bei Bild-Upload mit PHP


RMC
2005-04-12, 18:32:47
Also,

wenn ich eine <input type="file"..> Element habe und mir in diesem ein Bild aussuche und mein Formular dann absende, müsste ich mit PHP darauf zugreifen können und zb das Bild überprüfen (auf Abmessungen, Dateigröße etc.)

Das funktioniert am Localhost auch. Wenn ich ein Bild auswähle, dann hab ich ja den lokalen Pfad drinnen:

"C:\...\..\usw.\test.jpg"


Wenn ich das ganze am Server teste, dann bekomme ich, wenn ich die file-Variable in PHP ausgebe, irgendein kryptisches Temp-Verzeichnis geliefert, leider ohne irgendeine Dateiangabe.
Es sieht dann zb so aus:

"/tmp/phpiX8odf"

Folglich: Keine Datei, nur ein Verzeichnis...ich kann keine Dateiüberprüfung (zb auf Filetyp) machen. ;(

Wie kann ich das so ändern, dass es funktioniert? (blöde Frage) :rolleyes:

clm[k1]
2005-04-12, 19:25:22
http://www.forum-3dcenter.de/vbulletin/showpost.php?p=2745162&postcount=3


Das hilft dir hoffentlich weiter!
clm[k1]

RMC
2005-04-13, 11:08:26
danke, aber:

wenn ich

$_FILES['pic']['tmp_name'];

und

$_FILES['pic']['name'];

zusammenhänge, müsste ich den kompletten Pfad bekommen richtig? Nun, der sieht dann ca. so aus:

"/tmp/kryptischesTemporäresVerzeichnis/bild.jpg"


Ist ein relativer Pfad. Woher soll ich jetzt wissen wo /temp liegt? Hab ja keine Ahnung wie es auf dem Webserver ausschaut. Und in meinem Webverzeichnis gibts ka temp (außerdem wirds dort ja nicht zwischengespeichert, kann mit dem relativen Pfad von PHP aus damit also nix anfangen), also wo kopiert er das hin? :(

Ist es ev.:

Serveradresse + relativer Pfad?

mithrandir
2005-04-13, 12:04:35
Dere!

Kannst du einmal deinen Code posten?

bye, mith

RMC
2005-04-13, 12:51:19
$pic_path = $_FILES['pic']['tmp_name'];
$pic = $_FILES['pic']['name'];

$info = filesize ($pic_path.$pic);
$filesize = getimagesize ($pic_path.$pic);



das ist alles. Mit $info und $filesize will ich bei dem Upload-Bild dann überprüfen, ob es die richtige Filegröße, Abmessungen und den richtigen Typ hat. Nur ich kann nix überprüfen weil er das Bild net findet :( Lokal funktionierts nur am Server nicht.

TheCounter
2005-04-13, 13:00:12
So gehts, habs grad getestet.

Greif einfach auf das bild per tmp_name zu:


if(!$_FILES['datei']) {
<div>
<form action="upload.php" enctype="multipart/form-data" method="post">
<input name="pic" type="file" size="30" />
</form>
</div>
}else{
$file_name = $_FILES['pic']['name'];
$file_size = $_FILES['pic']['size'];
$file_type = $_FILES['pic']['type'];
$file = $_FILES['pic']['tmp_name'];

// Bildinfos auslesen

list($i_breite,$i_hoehe) = getimagesize($file);

?>
<div>
Bild erfolgreich hochgeladen:<br />
<br />
Breite: <? echo $i_breite; ?> Pixel<br />
Hoehe: <? echo $i_hoehe; ?> Pixel<br />
Groesse: <? echo ($file_size / 1024); ?> kb
</div>
<?

}


Ansonsten könntest du das Bild auch erst noch per move_uploaded_file verschieben.

RMC
2005-04-13, 13:12:20
gut, ok habs geändert. Nur mit "tmp_name"

dann sieht das jetzt so aus:


$pic_path = $_FILES['pic']['tmp_name'];
$pic = $_FILES['pic']['name'];

echo $pic_path;
if(move_uploaded_file($pic_path, "test.jpg"))
echo "erfolgreicher upload";
else
echo "kein Upload";



Resultat:

Lokal: Erfolg! (er lädt hoch von C:\Windows\Temp\irgendeinName.tmp)
Server: kein Erfolg (Verzeichnis ist /tmp/phpsmK4I9)

Am Server krieg ich nur irgendeinen komischen relativen Pfad...ka Wunder dass es net geht, wie krieg ich das hin? :(

TheCounter
2005-04-13, 13:14:40
Könntest du mal das ganze Script posten? Inkl. dem html/xhtml Teil (Das Form).

RMC
2005-04-13, 13:31:19
Das ganze Skript würde sämtlichen Rahmen sprengen, die PHP-Zeilen oben sind wirklich alles was das betrifft. Hier das HTML:


<form action="{ACTION}" method="post" enctype="multipart/form-data" name="form1" onSubmit="return checkForm()">
<table border="0" cellpadding="0" cellspacing="0" width="600">
<tr>
<td>Bild<br>jpg, png oder gif<br>max. 50KB<br> max. 200 x 200</td>
<td colspan="2">
<input type="file" class="textfield" name="pic"
onChange="javascript:generate_preview(this.value);"
value="{VALUE_PIC}">
</td>
</tr>
</table>
</form>

TheCounter
2005-04-13, 13:52:43
Hmm. Also das du auf dem Server einen relativen Pfad bekommst, das ist ganz normal. Der Pfad deutet auf das tmp Verzeichniss des Servers und beinhaltet auch den temporären Dateinamen der Datei die du gerade hochgeladen hast. Ab diesem Zeitpunkt müsstest du eigentlich auf die Datei zugreifen können. Sei es nun das du die Datei verschieben willst oder die größe auslesen willst.

Unterstützt die PHP Version auf dem Server überhaupt move_uploaded_file? Könntest ja auch mal folgendes probieren:


if(is_uploaded_file($HTTP_POST_FILES['pic'])) {
echo "Datei hochgeladen";
if(copy($HTTP_POST_FILES['pic'], $HTTP_POST_FILES['pic']['name'])) {
echo "Datei erfolgreich verschoben";
}
}

RMC
2005-04-13, 14:33:45
hm das Problem war: ich hatte keine Schreibrechte ;(

Aber noch etwas: ich kann das Bild nicht "on-the-fly" überprüfen. D.h. ausm Temp-Verzeichnis lesen und gleichzeitig die Überprüfung auf Typ, etc. machen.
Ich fürchte ich muss es zunächst am Server zwischenspeichern und DANN die Datei öffnen.