Boardunity & Video Forum

Boardunity & Video Forum (https://boardunity.de/)
-   Programmierung und Datenbanken (https://boardunity.de/programmierung-datenbanken-f23.html)
-   -   Bild Upload (https://boardunity.de/bild-upload-t1000.html)

Daniel Richter 30.11.2003 14:26

Bild Upload
 
Hallo Leute.

Im Zuge eines Newssystems für mein Forum brauche ich ein Bild Upload Skript. Ich habe mich auch jetzt soweit hingesetzt, komme aber zu Problemen. Wenn ich ein Bild hochlade kommt ständig "Datei bereits vorhanden. Bitte anderen Namen angeben." Hier ist mal der php Code:

PHP-Code:

/* Picture upload */
$filepath "files/upload/";

if (
$upfile_name != " ")
{
  if (!
file_exists($filepath.$upfile_name))
  {
    if (
copy($upfile$filepath.$upfile_name))
    {
      echo 
"Das Bild wurde gespeichert";
    }
    else
    {
      echo 
"Upload fehlgeschlagen";
    }
  }
  else
  {
    echo 
"Datei bereits vorhanden. Bitte anderen Namen angeben.";
  }
}

echo 
"<hr>";

unset(
$files);
if (
$dh opendir($filepath))
{
  while(
$file readdir($dh))
  {
    if (!
ereg("^\.+$",$file))
    {
      
$files[] = $file;
    }
  }
  
closedir($dh);
}

if (
is_array($files)) {
  
sort($files);
  
reset($files);
  foreach(
$file as $file) {
   echo 
$file"<br>";
  }


Und hier der Formularteil:

Code:

<TR>
<TD WIDTH=150 CLASS=left>
<B>Bild: </B>
</TD>
<TD WIDTH=440 CLASS=left>
<INPUT TYPE=hidden NAME=MAX_FILE_SIZE value=250000>
<INPUT TYPE=file NAME=picture>
</TD>
</TR>

Kann mir einer sagen, was da schief gegangen ist? Sollte doch so eigentlich klappen ...

DaddyCool 30.11.2003 14:59

Negativ, es hat sich in Sachen Upload seit Version 4.1 und 4.2 einiges getan.

Seit Version 4.1 werden die Daten ausser im Array $HTTP_POST_FILES auch im Array $_FILES gespeichert.

Seit Version 4.2 steht register_globals von Haus aus auf off, somit werden die Variablen die du verwendest nicht mehr gesetzt.

Probiers mal mit folgendem
PHP-Code:

<?php

/* Picture upload */
$filepath "files/upload/";

if (
is_uploaded_file($_FILES['picture']['tmp_name']))
{
  if (!
file_exists($filepath.$_FILES['name']))
  {
    if (
move_uploaded_file($_FILES['picture']['tmp_name'], $filepath.$_FILES['picture']['name']))
    {
      echo 
"Das Bild wurde gespeichert";
    }
    else
    {
      echo 
"Upload fehlgeschlagen";
    }
  }
  else
  {
    echo 
"Datei bereits vorhanden. Bitte anderen Namen angeben.";
  }
}

echo 
"<hr>";

unset(
$files);
if (
$dh opendir($filepath))
{
  while(
$file readdir($dh))
  {
    if (!
ereg("^.+$",$file))
    {
      
$files[] = $file;
    }
  }
  
closedir($dh);
}

if (
is_array($files)) {
  
sort($files);
  
reset($files);
  foreach(
$file as $file) {
   echo 
$file"<br>";
  }
}
?>

Schau dir auch mal http://www.php.net/manual/de/features.file-upload.php an

DaddyCool 30.11.2003 18:31

Zitat:

Original geschrieben von ciruZ
@DaddyCool:
Lieber $HTTP_POST_FILES wegen der Abwärtskompatibilität :)
Aber wenns nur für einen Server ist tuts natürlich auch $_FILES.

Das versteh ich jetzt nicht ganz.

Du setzt Funktionen ein die es erst ab PHP5 geben wird, und emulierst sie ggf., aber hier gehst du einen Schritt zurück und nutzt Variablen die es in späteren Versionen womöglich gar nicht mehr gibt. (jedenfalls machen sie nach einführung der Superglobalen immer weniger Sinn)

Was steckt da für eine Logik hinter??

Eher würde ich den Schritt gehen und die Versionen überprüfen und die Superglobalen Variablen falls nötig selbst setzen.

Wobei sich bei mir die Frage stellt, wer den überhaupt noch PHP < 4.1 einsetzt.

Daniel Richter 30.11.2003 19:29

@DaddyCool
Schon mal danke für deine Hilfe, aber es klappt nicht so recht. Es kommt keine Meldung. Es wird nix ausgegeben. Und das Bild wird in dem Ordner auch nicht gespeichert. Fehlermeldung kommt auch nicht ...

Daniel Richter 30.11.2003 19:36

Also 'nen kleinen Fehler habe ich gerade gefunden.
Ich habs enctype="multipart/form-data" im Formular vergessen. Doch es klappt immernoch nicht recht.

Es ist wie beim ersten Mal und zwar wird bei jedem Bild ausgegeben, dass das Bild schon existiert, obwohl keine Datei in dem Ordner ist.

Zitat:

Datei bereits vorhanden. Bitte anderen Namen angeben.

DaddyCool 30.11.2003 20:05

bau doch mal ein print_r($_FILES); ein und sag uns was er ausgibt.

Poste nochmal deinen neuen HTML Code

Daniel Richter 30.11.2003 20:09

Also dieses print_r gibt jetzt das aus. Damit kann ich absolut nix anfangen.

Zitat:

Array ( [picture] => Array ( [name] => php4.jpg [type] => image/pjpeg [tmp_name] => /tmp/phpQPEwOG [error] => 0 [size] => 25054 ) )
Das Formular ist etwas größer. Das ist der FORM Teil:

Code:

<FORM NAME=gb enctype=multipart/form-data METHOD=\"POST\" ACTION=\"$PHP_SELF?poster=".$db1['EID']."\">
Und die INPUT Felder sind geblieben

Code:

<INPUT TYPE=hidden NAME=MAX_FILE_SIZE value=250000>
<INPUT TYPE=file NAME=picture>


TRS 30.11.2003 20:13

PHP-Code:

<h1>Upload</h1>

<form
  action="<?php echo $_SERVER['PHP_SELF']; ?>"
  method="post"
  enctype="multipart/form-data">
<input type="file" name="probe" />
<input type="submit" value="Los!" />
</form>
<hr />
<?php
  
if (isset($_FILES['probe']) and ! $_FILES['probe']['error']) {
    
// Alternativ:            and   $_FILES['probe']['size']
    
move_uploaded_file($_FILES['probe']['tmp_name'], "./newfile.txt");
    
printf("Die Datei %s steht jetzt als " .
          
"newfile.txt zur Verfügung.<br />\n",
      
$_FILES['probe']['name']);
    
printf("Sie ist %u Bytes groß und vom Typ %s.<br />\n",
      
$_FILES['probe']['size'], $_FILES['probe']['type']);
  }
 
?>

Wichtig ist, dass der Dateiname entsprechend angepasst werden muss. Aus diesem Grund sollte man $_FILES['probe']['name'] nutzen anstatt newfile.txt

http://www.dclp-faq.de/q/q-formular-upload-php4.html

Daniel Richter 30.11.2003 20:18

PHP-Code:

/* Picture upload */
if (isset($_FILES['probe']) and ! $_FILES['probe']['error']) {
    
// Alternativ:            and   $_FILES['probe']['size']
    
move_uploaded_file($_FILES['probe']['tmp_name'], $_FILES['probe']['name']);
    
printf("Die Datei %s steht jetzt als " $_FILES['probe']['name'] . "zur Verfügung.<br />\n",
      
$_FILES['probe']['name']);
    
printf("Sie ist %u Bytes groß und vom Typ %s.<br />\n",
      
$_FILES['probe']['size'], $_FILES['probe']['type']);
  } 

Klappt nicht. Steht ja auch nirgends ein Pfad zum Hochladen :rolleyes:

DaddyCool 30.11.2003 20:23

mmh, ich seh in meinem Code grad nen Fehler.

Such mal
Code:

if (!file_exists($filepath.$_FILES['name']))
und ersetze es durch

Code:

if (!file_exists($filepath.$_FILES['picture']['name']))

Daniel Richter 30.11.2003 20:29

Hey jetzt hat das geklappt. Vielen Dank! :D

Daniel Richter 30.11.2003 20:38

Arks jetzt hab ich noch eine klitze kleine Sache.
Ich muss jetzt noch den Namen des Bildes in eine SQL Tabelle eintragen. Habs mit $_FILES[picture][name] versucht. Aber da wird nur Array [name] eingetragen. Mehr nicht.
Wie bekomm ich denn jetzt den Bild Namen (mit Endung) eingetragen?

Ich brauch ja im Prinzip nur den Namen der Datei. Den Rest kann ich wohl :D

Akira 30.11.2003 22:26

der name der datei wird auch in der variable gespeichert:
$HTTP_POST_FILES['file']['name']

das sollte eigendlich funtzen.
(wobei 'file' der name der feldes ist mit dem du das bild auswählst bevor du es hochlädst.)

DaddyCool 30.11.2003 22:26

Wenn das $_FILES[picture][name] innerhalb von Häckchen ist (z.B. mysql_query("INSERT INTO upload (dateiname) VALUES ('$_FILES[picture][name]')") ) dann mach daraus {$_FILES[picture][name]}

Schöner wäre es aber so: mysql_query("INSERT INTO upload (dateiname) VALUES ('".$_FILES['picture']['name']."')")

Akira 30.11.2003 22:32

ich schreibe meine sql befehle immer so:

mysql_query("INSERT INTO `upload` (`dateiname`) VALUES ('".$HTTP_POST_FILES['picture']['name']."')");

Daniel Richter 01.12.2003 17:40

Jap, dass hat geklappt.
Vielen Dank für eure Hilfe, Jungs!

Daniel Richter 01.12.2003 19:23

Ich hab das zwar auch schon in zahlreichen wBB Boards geschrieben, aber vielleicht kann mir ja hier jemand helfen.

----------------------

Hallo.

Ich knobel seit längerem an einem Problem. Und zwar habe ich einen User 'Nachrichten' bei dem möchte ich immer ein Bild in den Beitrag eingeblendet haben. Es ist je nach Beitrag ein anderes Bild. Der User ist eine Art Newssystem. Der Beitrag wird in einem externen ACP erstellt und im Portal und im Forum wird ein Thema erstellt. Es wird immer ein Bild zur entsprechenden Nachricht hochgeladen und der Name des Bildes wird in einer Tabelle abgespeichert. Soviel zur Hintergrundinformation.

Das für den User Nachrichten eine andere thread_postbit ausgegeben wird habe ich mittels Templateskripting schon hinbekommen allerdings scheitere ich bei der Ausgabe des Bildes. Ich habe bereits versucht in der global.php das Bild auszurufen

PHP-Code:

 $abfrage mysql_query("SELECT picture FROM news_content WHERE threadid = '".$thread['threadid']."'"); 

doch ich schaff es nicht den ausgegebenen Namen in eine Variable zu speichern, sodass ich die Variable im Template therad_postbit verwenden kann. Das ist also der Kernpunkt meiner Frage. Wie und wo muss ich eine Abfrage machen, damit ich den Bildnamen in eine Variable packen kann, die ich dann in den Templates verwenden kann?

Ich hoffe ich habe mich klar genug ausgedrückt. Es ist schwer zu erklären. Jedes Bild gehört ja einer bestimmten Nachricht an und jede Nachricht hat in der Tabelle 'news_content' auch eine threadid die identisch mit der aus dem Forum ist. Daher muss ich ja WHERE threadid = '".$thread['threadid']."' vergleichen. Nur noch kurz zur Erklärung.


Ich hoffe mir kann jemand helfen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:55 Uhr.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25