WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   PHP-Problem - Bildübermittlung (http://www.wcm.at/forum/showthread.php?t=56675)

MUCH 17.05.2002 01:34

PHP-Problem - Bildübermittlung
 
Liebe Gemeinde,


schön langsdam kommt meine Datenbank auf Touren (endlich harmonieren der Apache mit MySQL & PHP) - danke wegen des Links zu www.NuSphere.com


Die Voraussetzungen:
1. Datenbank unter mySQL erfolgreich angelegt
2. dazu eine Tabelle - dies beinhaltet die "VARCHAR"-Felder wie Name, Adresse, etc. UND ein Feld namens "Bild" vom Typ BLOB


Ich habe für PHP im Internet eine Eingabemaske gefunden - http://www.blindschleiche.de/Artikel...ysql-einf.php3 - und angepasst, wo eben Daten eingegeben werden können, die dann in meine Datenbank wandern.
NUR: Wie ermögliche ich die Übernahme eines Bildes?
(Es wird im Datensatz nicht das Bild als BLOB eingefügt, sondern nur die Ladeadresse - z.B.: C:\Bilder\Haus.jpg :( )



Hier ein Auszug aus dem PHP, wo die Dateneingabe passiert, das Problem mit dem BILD aber nicht klappt:

.
.
.


<form action= <? echo $PHP_SELF ?>>
<pre>
<input type=hidden name=funktion value= <? echo $funktion ?>>

Kontaktperson: <input type=text name=K_person value= <? echo $K_person ?>>
Strasse mit Hausnummer: <input type=text name=Str value= <? echo $Str ?>>
Ort: <input type=text name=Ort value= <? echo $Ort ?>>

Bild anfügen: <input type="hidden" name="MAX_FILE_SIZE" value="2097152">
<input type="file" class="bginput" name=Bild>


<input type=submit value= <? echo $funktion ?>> </pre>
</form>

.
.
.

Herzlichen Dank für Eure Mühe!!!

allwissende Müllhalde 17.05.2002 01:44

Mir fällt nur auf daß das name=Bild in deinem Formular
nicht in Anführungszeichen steht
name="Bild"

_m3 17.05.2002 03:54

Das Bild musst Du extra behandeln, dass wird nicht in einer Variablen abgelegt, von wo Du es einfach in die DB spielen kannst.

http://at.php.net/manual/de/features.file-upload.php
Genau durchlesen!!!

MUCH 17.05.2002 09:47

Das Bild soll direkt in die Datenbank...
 
der zitierte Artikel http://at.php.net/manual/de/features.file-upload.php hilft mir nicht sehr -
ich möchte das Bild ja NICHT als Datei, sondern direkt in meine Datenbank bei der Tabelle "adressen" ins Feld "Bild" vom Typ "BLOB" schreiben.

Wer könnte mir dabei bitte helfen???

danke!

_m3 17.05.2002 10:53

Ich sagte ja - GENAU lesen!

Das Bild wird Dir von PHP nicht automatisch in eine Variable gestellt, die Du dann einfach in die DB schreiben kannst, sondern du musst das Kopieren der Datei in die DB selber ausprogrammieren!
D.h. Datei oeffnen, in eine Variable einlesen, und dann diese Variable in ein Feld der DB inserten.
Jetzt klarer?

Code:

$filecontent = fread(fopen("/usr/local/myfile.jpg", "r"),
filesize("usr/local/myfile.jpg"));
 $filecontent = addslashes($filecontent);
 $res = mysql_db_query("testdb", "
          INSERT
            INTO testtable
          VALUES
            (
            '$filecontent'
            )") or die("Konnte Datei nicht in Datenbank speichern!");


MUCH 17.05.2002 11:17

danke!!!

Ein Problem besteht noch wenn ich Dein beschriebenes fopen("/usr/local/myfile.jpg", "r"), mache:

WO in meiner Umgebung liegt dieses Bild, nachdem ich es in der FORM eingegeben habe?

Muss ich da im INI des Apache bzw. PHP oder MySQL was verändern, bzw. überhaupt erst was definieren, um das von Dir zitierte "/usr/local/myfile.jpg" irgendwo zu sehen?

wenn ich mir meine Daten aus der Bank aufliste, hatte ich nämlich schon einmal beim Herumprobieren mit meiner Eingabemaske einen Text-Eintrag ins Feld "Bild" hineinbekommen.

einmal "H:WINDOWSphp1A.tmp" (ohne "\" )

und ein weiteres Mal:
"G:\Bilder\Julia.jpg" (weiss aber nicht mehr, wie ich zu diesem eher aussagekräftigem Dateinamen kam???)


momentan sehe ich den Wald vor lauter Bäumen nicht mehr ;)

_m3 17.05.2002 11:22

Oida voda!

Meinen Link hast Du nicht gelesen, oder? :(
Der Dateiname im Script war ja nur fuer Demo-Zwecke, den richtigen "temporaeren Namen bekommst Du ueber
Zitat:

$HTTP_POST_FILES['userfile']['tmp_name']
Der temporäre Dateiname, unter dem die hochgeladene Datei auf dem Server gespeichert wurde.

Wenn register_globals in der php.ini aktiviert ist, stehen unter der Annahme, dass der Name des Dateiuploads wie in dem obigen Beispielskript 'userfile' ist, zur Verfügung:
$userfile - Der temporäre Name, unter dem die hochgeladene Datei auf dem Server gespeichert wurde.

kikakater 18.05.2002 16:30

Felder mit dem Datentyp BLOB können mit LOAD_FILE(filename) gefüllt werden (der Datentyp BLOB erlaubt maximal 64 KB Dateninhalt)

_m3 19.05.2002 15:27

TINYBLOB, TINYTEXT L+1 bytes, where L < 2^8
BLOB, TEXT L+2 bytes, where L < 2^16
MEDIUMBLOB, MEDIUMTEXT L+3 bytes, where L < 2^24
LONGBLOB, LONGTEXT L+4 bytes, where L < 2^32

Ein Beispiel zu load_file gibts hier: http://gd.tuwien.ac.at/db/mysql/doc/...functions.html

kikakater 19.05.2002 15:55

Ein Verweis auf die Bilddatei mittels VARCHAR Textfeld 'Dateiname' - z.B. - funzt wesentlich besser. Weniger Segmentierung, weniger Daten in der Datenbank bla bla bla ...

Ein einfaches echo "<img src=\"$Dateiname\">"; im php Teil eines *.php / *.phtml Skripts sollte die Datei vom Dateisystem aus laden. Sollte der 'Pfad zur Datei' ein absoluter sein, muß man den HTML Code um "file:" erweitern.

echo "<img src=\"file:$Dateiname\">";

_m3 19.05.2002 16:29

Lieber kikakater: Tschuldigung, aber das ist ein Blödsinn.

Mit dem file-Schema (file:.....) kann man nur Files auf dem lokalen Rechner, auf dem der Browser läuft, referenzieren.

Eine "absoluter"-URI besteht aus "<scheme>:<scheme-specific-part>", also bei http aus "http://Servername_oder_IP-Adresse/Pfad_zu_Datei/Datei", für eine gif-Datei am WCM-WebServer zum Beipiel "http://www.wcm.at/bilder/200205/0ti4200.jpg".
Wenn die HTML-Datei, in der ich das Bild einbauen will, im root-Verzeichnis des WebServers steht, reicht bei vorigem Beispiel "bilder/200205/0ti4200.jpg", oder wenn ich im Verzeichnis "html" bin ein "../bilder/200205/0ti4200.jpg", um auf das Bild über eine relative URI zuzugreifen.

Siehe auch
http://www.rfc-editor.org/rfc/rfc1630.txt
und
http://www.rfc-editor.org/rfc/rfc2396.txt

MUCH 21.05.2002 16:34

Gelöst!
 
Unter http://www.phpbuilder.com/columns/fl...3?print_mode=1 habe ich das für mich passende im Quelltext gefunden :)

danke Euch allen für die aufgebrachte Geduld mit mir "PHP-mySQL-Dummy"! :lol:

MUCH 25.05.2002 09:21

Filetypen unter "Datei auswählen" beschränken
 
...obwohl ich bereits google bemühte, wurde ich leider nicht fündig, darum nochmals hier:

Dies ist natürlich nur eine kleine optische Korrektur -

Wie kann ich meinem Dateiauswahlfeld mitteilen, dass der eingebenden Person beim Auswählen der upload-Datei z.B. nur Dateien vom Typ *.jpg und *.gif angezeigt werden sollen?

danke!

_m3 25.05.2002 10:10

AFAIK ist das mit HTML-Mitteln nicht möglich.

kingchaos01 28.05.2002 12:12

spät aber...
 
ich muss mal die provokante frage stellen:
wozu soll man eine binär-datei in eine datenbank reinwürgen, um sie dann mit header und allem drum un dran wieder mühsam auszulesen, wenn es dafür auch ein altes aber gutes ding namens "filesystem" gibt. kikakater hats ja schon angesprochen.

dafür ist die datenbank nicht gedacht.
dafür wurde das filesystem erfunden.

man lege also in der datenbank ein feld namens "dateiname" und meinetwegen auch noch irgendwelche metafelder an, und speichere das bild als bild, wie es sich gehört.

my 2 cents
roland

kikakater 28.05.2002 13:04

Der Grund um so etwas zu tun heißt Datenkapselung, Betriebssystemunabhängigkeit, Verbergen von Daten mittels SQL im Gegensatz zu Java Servlets und Dateizugriff. Einfacher ist es für homogene Systeme die Bilder vom Dateisystem aus zu laden und sich derart des Streßes mit der Verwaltung der Bilder in der Datenbank zu entledigen.

MUCH 19.06.2002 13:04

ich folge Euch und möchte mein Bild im filesystem ablegen...
 
Liebe Gemeinde,


nachdem das Projekt länger geruht hat, wird es wieder aktuell...

Nun habe ich Euren Rat beherzigt und möchte das Bild nicht in die DB reinquetschen, sondern ins Filesystem legen:

NUR: Auch nach GENAUEM Lesens der Tips von "_m3" bringe ich das Bild nicht ins Filesystem??? :(


Hier mein Ansatz:

Ich habe meine Eingabefelder in einem FORM-Feld (für die Eingabe der Daten und des Bildes)
Auszug daraus:
Code:

    <INPUT type="hidden" name="MAX_FILE_SIZE" value="62000">
    <input type="file" name="userfile">
    <input type="submit" name="submit" value="Meine Daten übertragen">
    </form>

Abgeschaut aus dem link von "_m3" habe ich folgendes:

Ich möchte nun, dass das lokale Bild ins Dateisystem meines SQL-servers ins Unterverzeichnis "BILDER" übertragen wird:
Dieser Ordner heisst in meiner lokalen Testumgebung "H:\APACHE\mysql\data\VDB\Bilder"
(Die Datenbank selbst hat den Namen "VDB" bzw. der für mich relevante Table "adressen", der halt im Ordner "H:\APACHE\mysql\data\VDB\" liegt)


Im bereits oben zitierten PHP habe ich folgende Zeilen zwecks Übergabe der Daten eingebaut:
Code:

if ($submit) {
    MYSQL_CONNECT("localhost",$dbuser,$dbpasswd) or die ("Datenbankzugriff derzeit nicht möglich...");
    mysql_select_db($db);

if ($userfile<>"none"){
$Bild = $HTTP_POST_FILES['userfile']['name'];
if (is_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name']))
{copy($HTTP_POST_FILES['userfile']['tmp_name'], "/Bilder");}
else
{echo "Possible file upload attack. Filename: " . $HTTP_POST_FILES['userfile']['name'];}

$result=MYSQL_QUERY("INSERT INTO adressen(Haus, Mail, Bild) ".
    "VALUES ('$Haus', '$Mail', '$Bild')");    }

NUR: Das Bild kommt dort nie an???

Es erscheint aber auch keine Fehlermeldung gemäß "Possible file upload attack", der Bildname selbst ist natürlich in der Datenbank aufgenommen...


Danke für Eure Hilfe!!!

_m3 19.06.2002 13:59

Kommt er überhaupt in die
if ($submit) {
hinein - sprich ist $submit TRUE?

Weiters solltest Du den Rückgabewert von
copy($HTTP_POST_FILES['userfile']['tmp_name'], "/Bilder");
abfangen und entsprechend auswerten. Und "/Bilder" sollte wohl eher dem kompletten Pfad inkl. Dateinamen das Files enstsprechen, wo du es hinkopieren willst.

MUCH 19.06.2002 14:28

Es funktioniert fast:

Das submit passt - ich habe vergessen, den Dateinamen anzufügen:
{copy($HTTP_POST_FILES['userfile']['tmp_name'], "H:/APACHE/mysql/data/VDB/Bilder/$Bild") funktioniert...

Aber: mit "/bilder/$Bild" geht es nicht - gibt es da eine environment-Variable, da mir folgende Fehlermeldung kommt???

Warning: Unable to create '/bilder/testfoto.jpg': No such file or directory in h:\apache\apache\htdocs\eingabe.php on line 24

die sich auf den Pfad der PHP-Maske bezieht?

danke!

_m3 19.06.2002 14:40

"/bilder/$Bild" ist Unix-Notation. Damit speichert er das Bild Im Verzeichnis "bilder", das auf der ersten Eben unterhalb von "/" (so wie tmp, usr, ...) liegt, ab.

Entweder gibst Du den Pfad relativ zur Lokation des Scripts an
"../../mysql/data/VDB/bilder/$Bild"
oder eben ansolut
"H:/APACHE/mysql/data/VDB/Bilder/$Bild".

Alles klar?

MUCH 19.06.2002 14:47

@_m3: danke für Deine Hilfe!

Noch eine letzte Frage: Wenn es dann in meiner "echten" DB läuft, gebe ich dort einfach "http://servername.at/Bilder/$Bild" ein?

_m3 19.06.2002 14:51

Wenn Du den Server richtig konfigurierts, dann geht das schon ;)

MUCH 19.06.2002 15:23

...ich fürchte, dass ich Dich - wenn es denn endlich soweit ist - wieder nerven muss ;)

Hier nochmals ein dickes DANKE für Deine Geduld & Hilfe !!!


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag