HTMLWorld - HTML, CSS, JavaScript, PHP, Java, Flash und vieles mehrHTMLWorld:   Home | Impressum
 

 
 

Anzeige 
 
HTMLWorld » Forum

Thema anzeigen - Bild Upload per php

 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Bild Upload per php
Gehe zu Seite 1, 2, 3  Weiter
 

Neues Thema eröffnen   Neue Antwort erstellen    HTMLWorld Foren-Übersicht
   PHP
Vorheriges Thema:
Nächstes Thema:  
Autor Nachricht
marck48
Häufiger Poster


Anmeldungsdatum: 10.02.2009
Beiträge: 25
Wohnort: Eberswalde

BeitragVerfasst am: 10.02.2009 12:31:35    Titel: Bild Upload per php Antworten mit Zitat

Hallo,
ich habe folgendes Problem und ich hoffe man kann mir helfen...
bin Anfänger was php betrifft.

über folgendes script übertrage ich fotos die in ein verzeichnis auf dem server gespeichert werden und dessen name in einer msql-datenbank gespeichert wird.
Nun habe ich festgestellt das schon vorhandene Bilder überschrieben werden. Meine Frage wie kann ich das verhindern.
Vielen Dank für die Hilfe

Hier das Script das ich benutze

<?
{
$file = $_FILES['userfile']['tmp_name']; // Temporary filename in which the uploaded file was stored on the server
$filename = $_FILES['userfile']['name']; // Original name of the file on the client machine
$filesize = $_FILES['userfile']['size']; // filesize in bytes
$path = "fotos/"; // Pfad zum Upload Verzeichnis
if (file_exists($file)) echo('<p class="upload" align="center">1. Foto wurde gefunden!</p>'); else echo ('<p class="upload" align="center">1. Foto wurde nicht gefunden!</p>');

if (!file_exists($path.$filename)){ // File exists verification
if(!copy($file,$path.$filename)) echo " <font color='red'>".$message["uncomplete"]."</font><br><br>";
else echo " <font color='red'>".$message["complete"]."</font><br><br>";
} else {
echo " <font color='red'>".$message["fileexists"]."</font><br>";
}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Frosty
Häufiger Poster


Anmeldungsdatum: 27.10.2008
Beiträge: 221

BeitragVerfasst am: 10.02.2009 12:46:18    Titel: Antworten mit Zitat

Ich versteh nicht ganz. Bilder mit gleichem Namen werden im Verzeichnis überschrieben? Oder in der Datenbank? Wobei ich in deinem Code-Schnipsel keine Datenbank-Implementierung sehe.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
marck48
Häufiger Poster


Anmeldungsdatum: 10.02.2009
Beiträge: 25
Wohnort: Eberswalde

BeitragVerfasst am: 10.02.2009 12:55:05    Titel: Bild Upload per php Antworten mit Zitat

Hallo

zB ladet jemand das Foto mit dem Namen foto.jpg hoch das aber in dem Ordner wohin die Fotos auf dem Server gespeichert werden schon vorhanden ist. Also wird es überschrieben. wie kann ich das verhindern?

hier nochmal der code

<?
{
$file = $_FILES['userfile']['tmp_name']; // Temporary filename in which the uploaded file was stored on the server
$filename = $_FILES['userfile']['name']; // Original name of the file on the client machine
$filesize = $_FILES['userfile']['size']; // filesize in bytes
$path = "fotos/"; // Pfad zum Upload Verzeichnis
if (file_exists($file)) echo('<p class="upload" align="center">1. Foto wurde gefunden!</p>'); else echo ('<p class="upload" align="center">1. Foto wurde nicht gefunden!</p>');

if (!file_exists($path.$filename)){ // File exists verification
if(!copy($file,$path.$filename)) echo " <font color='red'>".$message["uncomplete"]."</font><br><br>";
else echo " <font color='red'>".$message["complete"]."</font><br><br>";
} else {
echo " <font color='red'>".$message["fileexists"]."</font><br>";
}

if ($submit) {
$db = mysql_connect("localhost", "Uxxxx","pass");
mysql_select_db("DBxxxx",$db);
$sql = "INSERT INTO oldtimer (anr,firmenname,vorname,name,email_besitzer,tel_besitzer,auto_typ,motorrad_typ,fahrrad_typ,ersatzteile,gesuche,plz,plz_moto,plz_rad,plz_gesuch,plz_ersatz,ort,strasse,baujahr,moto_baujahr,rad_baujahr,gesuch_baujahr,ersatz_baujahr,kilometer,moto_kilometer,gesuch_kilometer,leistung,moto_leistung,preis,moto_preis,rad_preis,gesuch_preis,ersatz_preis,rad_marke,gesuch_marke,ersatz_marke,rad_groesse,rad_zustand,beschreibung,userfile,userfile1,userfile2,userfile3,modell,farbe,bauart,moto_bauart,gesuch_bauart,ersatz_bauart,literatur,ersatz,datum,deutsch) VALUES
('$anr','$firmenname','$vorname','$name','$email_besitzer','$tel_besitzer','$auto_typ','$motorrad_typ','$fahrrad_typ','$ersatzteile','$gesuche','$plz','$plz_moto','$plz_rad','$plz_gesuch','$plz_ersatz','$ort','$strasse','$baujahr','$moto_baujahr','$rad_baujahr','$gesuch_baujahr','$ersatz_baujahr','$kilometer','$moto_kilometer','$gesuch_kilometer','$leistung','$moto_leistung','$preis','$moto_preis','$rad_preis','$gesuch_preis','$ersatz_preis','$rad_marke','$gesuch_marke','$ersatz_marke','$rad_groesse','$rad_zustand','$beschreibung','$filename','$filename1','$filename2','$filename3','$modell','$farbe','$bauart','$moto_bauart','$gesuch_bauart','$ersatz_bauart','$literatur','$ersatz','$datum','$deutsch')";

$result = mysql_query($sql,$db);
echo ('<p class="upload" align="center">Ihre Daten wurden abgeschickt! - Vielen Dank!<br><br></p>');
}
}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Frosty
Häufiger Poster


Anmeldungsdatum: 27.10.2008
Beiträge: 221

BeitragVerfasst am: 10.02.2009 13:30:30    Titel: Antworten mit Zitat

Heyjo,
also du kannst jeder hochgeladenen Datei einen eigenen Namen verpassen, mit fortlaufender Nummer.

In deinem Fall ist das die Variable $filename.
Sinnvoll ist es zu gucken, wieviele Dateien denn schon im Foto-Verzeichnis vorhanden sind. Stichwort: scandir()

Anzahl dann + 1 und du hast eine variable Nummer für das Bild, die einmalig ist. MIME-Typ des Bildes müsstest du natürlich dann abfangen mit
Code:
$_FILES['userfile']['type']

damit dein Programm weiss, welchen Typ das Bild hat.

Ja, sieht nach einem spannenden Projekt aus. Bei der Menge von Daten die du da in deiner Tabelle speicherst, solltest du dir mal über Normalisierung von Datenbanken Gedanken machen. Soweit ich sehen kann wird einfach alles in die Tabelle oldtimer gespeichert. Das gibt über kurz oder lang Redundanzen (Doppelte einträge).

Stell dir mal vor es gibt jemanden, der hat mehrere Oldtimer, die aber an verschiedenen Adressen stehen oder verschiedenen Baujahrs sind. Du müsstest für jeden dieser Wagen einen neuen Datensatz anlegen, der immer wieder den selben Besitzernamen enthält. Was aber machst du wenn der Besitzer seine Adresse ändert. Du müsstest die gesamte Tabelle durchlaufen und jeden einzelnen Datensatz der diesen Besitzer enthält ändern. Das geht extrem zu Lasten der Performanz deiner Datenbank.

Hoffentlich bist du jetzt nicht entrüstet.

LG
Frost
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
marck48
Häufiger Poster


Anmeldungsdatum: 10.02.2009
Beiträge: 25
Wohnort: Eberswalde

BeitragVerfasst am: 10.02.2009 13:44:27    Titel: Bild Upload per php Antworten mit Zitat

Ersteinmal Danke für die Hilfe,
da ich aber ein Anfäger bin würde ich dich darum bitten mir zu schreiben was ich genau an dem script ändern muß das wär sehr nett von dir
vielen Dank marck
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Frosty
Häufiger Poster


Anmeldungsdatum: 27.10.2008
Beiträge: 221

BeitragVerfasst am: 10.02.2009 14:04:48    Titel: Antworten mit Zitat

Code:
$file = $_FILES['userfile']['tmp_name'];
$filesize = $_FILES['userfile']['size'];
$path = "fotos/";

//Type abfangen
$filetype = $_FILES['userfile']['type'];

switch($filetype)
{
   case "image/pjpeg":
      $type = ".jpg";
   break;
   
   case "image/gif":
      $type = ".gif";
   break;
   
   case "image/jpeg":
      $type = ".jpg";
   break;
   
   case "image/x-png":
      $type = ".png";
   break;
   //usw.
}

//anzahl der dateien im Verzeichnis
$all_files = count(scandir($path)) - 2;

//Jetzt individuellen Namen für das Bild generieren
$myFilename = "bild_".$all_files.$type;

if (!file_exists($path.$myFilename))
{
   if(!copy($file,$path.$myFilename))
      echo "Konnte nicht speichern.";
   else
      echo "Gespeichert.";
}
else
{
   echo "Foto schon vorhanden.";
}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
marck48
Häufiger Poster


Anmeldungsdatum: 10.02.2009
Beiträge: 25
Wohnort: Eberswalde

BeitragVerfasst am: 10.02.2009 14:28:52    Titel: Bild Upload per php Antworten mit Zitat

Ist das jetzt der komplette code oder nur die zeilen die geändert werden müssen...
tut mir leid aber ich muß noch viel lernen

gruß
marck
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Frosty
Häufiger Poster


Anmeldungsdatum: 27.10.2008
Beiträge: 221

BeitragVerfasst am: 10.02.2009 14:39:06    Titel: Antworten mit Zitat

Hm, teils teils...

also Ausgangscode ist dein vorvorletzter Post.

Alles mit neuen Code ersetzen bis Zeile

Code:
if ($submit) {


Wobei die Ausgaben (echo) von mir geändert wurden und du sie ruhig mit deinen wieder austauschen kannst.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
marck48
Häufiger Poster


Anmeldungsdatum: 10.02.2009
Beiträge: 25
Wohnort: Eberswalde

BeitragVerfasst am: 10.02.2009 14:58:22    Titel: Bild Upload per php Antworten mit Zitat

Hab das jetzt so geändert und hab folgenden fehler angezeigt bekommen

Fatal error: Call to undefined function: scandir() in /mnt/web1/53/49/520549/htdocs/immobilien/upload.php on line 365
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Frosty
Häufiger Poster


Anmeldungsdatum: 27.10.2008
Beiträge: 221

BeitragVerfasst am: 10.02.2009 15:00:28    Titel: Antworten mit Zitat

Ja, dann nutzt dein Webserver noch kein php5.

Erstell mal eine neue php-Datei und schreib

Code:
<?php
   phpinfo();
?>


rein. und sag mir dann, welche php-version der Webserver nutzt.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
marck48
Häufiger Poster


Anmeldungsdatum: 10.02.2009
Beiträge: 25
Wohnort: Eberswalde

BeitragVerfasst am: 10.02.2009 15:11:13    Titel: Bild Upload per php Antworten mit Zitat

Jetzt kam die meldung "konnte nicht speichern"
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Frosty
Häufiger Poster


Anmeldungsdatum: 27.10.2008
Beiträge: 221

BeitragVerfasst am: 10.02.2009 15:17:33    Titel: Antworten mit Zitat

Ist ziemlich schwer, dir da zu helfen. Wenn du kein PHP5 laufen hast und du auch nicht die möglichkeit hast, auf php5 zu updaten, dann ersetzte zeile:

Code:
$all_files = count(scandir($path)) - 2;


mit

Code:
$file_open = opendir($path);
$all_files = 0;
while ($file = readdir ($file_open))
{
   if(!is_dir($file))
   {
       $all_files++;
    }
}
closedir($file_open);
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Frosty
Häufiger Poster


Anmeldungsdatum: 27.10.2008
Beiträge: 221

BeitragVerfasst am: 10.02.2009 15:21:14    Titel: Antworten mit Zitat

Natürlich steht da "Konnte nicht speichern.", weil noch keine Datei gesendet wurde.

Ich hoffe sehr, dass du ein Formular hast, mit welchem der User sein Bild uploaden kann. Idealerweise trägt das Upload-Steuerelement den Namen "userfile". Erst wenn dieses gesendet wurde, kann das Script das bild auch speichern.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
marck48
Häufiger Poster


Anmeldungsdatum: 10.02.2009
Beiträge: 25
Wohnort: Eberswalde

BeitragVerfasst am: 10.02.2009 17:30:23    Titel: Bild Upload per php Antworten mit Zitat

So das Foto wird jetzt in den ordner gespeichert als bild_2 usw. leider werden die anderen daten nicht in die DB geschrieben.
Was muß ich noch ändern wenn ich mehrere fotos übertragen will
Vielen Dank für die Hilfe
Gruß
marck
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Frosty
Häufiger Poster


Anmeldungsdatum: 27.10.2008
Beiträge: 221

BeitragVerfasst am: 11.02.2009 09:33:56    Titel: Antworten mit Zitat

Der Name der Variable hat sich durch das neue skript geändert.

vorher: $filename
jetzt: $myFilename

Das musst du auch im SQL-Query ändern. Ich vermute mal dass das dafür vorgesehene Feld in der Tabelle userfile ist.

Zitat:
Was muß ich noch ändern wenn ich mehrere fotos übertragen will


Nun ja, jetzt haben wir wieder ein Problem. Wenn ein User mehrere Bilder hochladen möchte, dann kommst du mit einer Tabelle niemals mehr hin. Es sei denn du erstellst genau den gleichen Datensatz, nur mit einem anderen Bildnamen. Und das ist das Problem, welches ich zuvor schon ansprach -> Redundanzen (doppelte Einträge).

Du musst also eine zweite Tabelle erstellen, in welcher du die Bildnamen mit zugehörigen User ablegst.

Dafür müssen deine User eine eindeutige ID bekommen (Primärschlüssel) in deiner ersten Tabelle. Also erstelle in deiner ersten Tabelle eine neue Spalte "user_ID", die du als Primärschlüssel deklarierst, am besten mit fortlaufender Nummer (inkrementieren). Ich gehe davon aus, dass du schon etliche Datensätze in der Tabelle hast, deswegen müsstest du die vorhandenen Datensätzen manuell (evtl. mit einem kleinen Skript) mit einer ID belegen. alle Folgenden bekommen dann automatisch die nächst höhere ID.

Dann erstelle eine zweite Tabelle (Bsp: T_Userbilder) mit den Feldern bild_id, user_ID, bild_name. Hier kannst du jetzt alle Bilder speichern, die ein User ablegen will. In user_ID muss die entsprechende user ID der ersten Tabelle 'oldtimer' stehen. Primärschlüssel sollte dann bild_id sein.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    HTMLWorld Foren-Übersicht
   PHP
Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2, 3  Weiter
Seite 1 von 3

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.