WebWork Magazin - Webseiten erstellen lassen, Online Medien, html

Webhoster, Webhosting Provider und Domain registrieren

Home | Registrieren | Einloggen | Suchen | Aktuelles | GSL-Webservice | Suleitec Webhosting
Reparatur-Forum | Elektro forum | Ersatzteilshop Haushalt und Elektronik


Homepage und Webhosting-Forum

Scripte und Programme für PHP, MYSQL. Diskussionen zur Programmierung im Web. Fragen zu CMS, Blogsoftware, Shops, Newsletter und vielen weiteren Scripten.


Forum » PHP & MySQL » Binär-Daten von Upload in DB speichern » Antworten
Benutzername:
Passwort: Passwort vergessen?
Inhalt der Nachricht: Fett | Kursiv | Unterstrichen | Link | Bild | Smiley | Zitat | Zentriert | Quellcode| Kleiner Text
Optionen: Emailbenachrichtigung bei Antworten
 

Binär-Daten von Upload in DB speichern
von DJOtti
Vielen Dank, Languitar.
Manchmal steht man da, wie ein Ochs vorm Berg. Natürlich hast du recht, jetzt funktioniert es auch.

Gruss
von languitar
du führst den in $sql gespeicherten Query ja gar nicht aus. dann kann auch nichts in der DB landen.
von DJOtti
Hallo,
kann mir auch jemand helfen, bin nicht so das Programmiergenie. Versuche mit diesem Code die Datei auf einen Server zu laden und gleichzeitig den Datei-Namen (strFileName) und die Beschreibung (bildername) in eine DB-Tabelle (newsbilder) zu schreiben. Aber irgendwie bekomme ich hiermit nur den Upload hin, er schreib mir nichts in die DB.

Wäre nett, wenn mir irgendeiner helfen könnte.

Gruss
Frank


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: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: 
36: 
37: 
38: 
39: 
40: 
41: 
42: 
43: 
44: 
45: 
46: 
47: 
48: 
49: 
50: 
51: 
52: 
53: 
54: 
55: 
56: 
57: 
58: 
59: 
60: 
61: 
62: 
63: 
64: 
65: 
66: 
67: 
68:
<?php
//Verbindung zum Datenbankserver
include ("mysql.php");
?>
<?php

$pfad   	= "/home/www/web***/images/news";  # absoluter Pfad zum Uploadordner / Chmod 7-7-7
$numfiles   = "1";										 					# Anzahl der Uploadfelder
$b_min	    = "10";										 					# minimale Bytes
$b_max      = "1048576";						    		 					# maximale Bytes / 1024 Bytes = 1 KB / 1024 KB = 1 MB

$mb = $b_max/1048576;
$mb = round($mb, 2);

// Datei hochladen
if (isset($sendfiles)){

  if ("$bildername" == ""  ) {
    echo ("<p>&nbsp;<p>Es muss mindestens der Name eingetragen werden !!!<p><a href='javascript:history.back()'>zur&uuml;ck</a><p>");
    exit();
  } else {

	$numsendfiles = count($HTTP_POST_FILES);
	foreach($HTTP_POST_FILES as $strFieldName => $arrPostFiles){
    if ($arrPostFiles['size'] > $b_min && $arrPostFiles['size'] < $b_max){
			$strFileName = $arrPostFiles['name'];
			$strFileTemp = $arrPostFiles['tmp_name'];
			@copy ($strFileTemp, "$pfad/$strFileName");
			echo "<br><span class=\"grossschrift\"><font color=#820000><b>Datei <u>$strFileName</u> erfolgreich  hochgeladen.</b></font></span><br>";
			
    $bildername = strip_tags($bildername);
    $strFileName = strip_tags($strFileName);
  	    
    $bildername = str_replace('"', "'", $bildername);
	$strFileName = str_replace('"', "'", $strFileName);
		
   	// $sql = "insert into (bildername,strFileName) VALUES( '$bildername', '$strFileName')";
    $sql = "insert into newsbilder set
			bildername = '$bildername',
	  	    strFileName = '$strFileName'";
		
	}else{
	   		echo "<br><span class=\"grossschrift\"><font color=red><b>Die Datei mu&szlig; gr&ouml;&szlig;er als $b_min Bytes und kleiner als $mb MB sein!</b></font></span><br>";}

    }

  } // if
	
} // if (isset($sendfiles))

?>
<table cellspacing="0" cellpadding="0" border="0"><tr><td>
Die Datei darf nicht gr&ouml;&szlig;er als <?php echo "$mb"; ?> MB sein.<br>

<form enctype="multipart/form-data" method="post" action="<? echo $PHP_SELF ?>">
<?php
echo " Bildername:<br><input name=bildername type=text class=text size=40><br><br>";
echo "<b>$numfiles</b> ";
echo $numfiles == '1' ? 'Datei kann' : 'Dateien k&ouml;nnen';
echo ' hochgeladen werden.<p>';

for ($i=1; $i<=$numfiles; $i++){
	echo "<input type=\"File\" name=\"myfile$i\" class=\"input\"><br>\n";}
	echo '<br><br><input type="Submit" name="sendfiles" value="hochladen" class="button"><br>';

?>

</form>
von subjective
Ich hatte das ja schon darauf eingeschränkt, das Upload- und Seitenserver identisch wären.

Du hast natürlich recht. Bei einem solchen verteilten System, wie du es beschreibst, macht es sehr viel Sinn den zweiten Teil der Strecke FTP zu nutzen.
von raiserle
achso, vergessen...
bei anderen scripten von mir, wird natürlich nur http(php) benutzt,
um bilder hochzuladen...
wie bei dem mit ftp, wird der pfad dann wieder in der mysql hinterlegt....

hätte vielleicht nen anderes script raussuchen sollen, um das hier nicht
unnötig zu komplizieren. das war aber gleich das erste, was ich in die finger bekommen
habe.
von raiserle
@ subjective:

es macht schon sinn bei mir...

die normale ist wohl schon, wie du sagst.... nur hatte ich glaub schon dazu gesagt,
oder nicht?, das meicn webserver hier local bei mir steht.
damit die bilder nicht so viel traffic bei mir verursachen, lade ich sie per ftp zu lycos hoch
und setze den pfad zum bild in der sql ein....
von monolit
Okay wenn du das so unterscheidest, hab ich mich wohl falsch ausgedrückt *g*
Ich meinte in Bezug auf den obigen Post die erste Möglichkeit ;)
von subjective
Drei Varianten

1. HTTP-Upload - Metadaten in die DB
2. HTTP-Upload - Alles in die DB
3. FTP-Upload - Sync in die DB

Der erste Fall ist die "normale" und wohl häufigste Variante. Einfach hochladen in ein bestimmtes Verzeichnis (möglichst außerhalb des Document-Root). Die zweite Variante ist bei verteilten Systemen denkbar, welche auf eine zentrale Datenbank zugreifen. Jedoch sollten die einzelnen Webserver die Bilder dann lokal cachen (im Dateisystem).

Der letzte Fall spielt seinne Vorteil aus, wenn man den Upload nicht mehr nur über den Browser erledigt. FTP ist deutlich schneller und kommt auch mit sehr großen Dateien zurecht. Die Vorteile kommen jedoch nur zum Tragen, wenn man einen speziellen Client nutzt.

von monolit
Naja - ich denke wir können uns darauf einigen, dass je nach Nutzen die entsprechede Lösung (DB Store, FTP) praktibal ist. Das muss man eben abwägen. Hat beides seine Vor- und Nachteile.
von subjective
Das laden auf den "FTP" ist auch nur in Sonderfällen sinnvoll. Damit PHP Bilder auf einen FTP-SErver laden kann, müssen sie erstmal per HTTP-Upload auf den Rechner, auf welchem PHP läuft. Wenn dieser mit dem Webseiten-Auslieferer identisch ist, mahct es wenig Sinn die Dateien noch mal über FTP zu senden, da man sie auch direkt in den Zielpfad verschieben kann.
von monolit
Hallo,

ich möchte dir nicht den Tag versauen, kann mich aber den Vorrednern nur anschliessen.
Bildupload macht in der Regel in eine DB wenig Sinn. Die Gründe dafür haben meine Vorredner bereits genannt. Sowas macht nur in ganz speziellen Fällen Sinn.

Wobei ich denke dass so ein Thema wieder ne Diskussion auslösen könnte

Ansonsten:

Bild auf nen FTP laden -> Pfad dann in der MySQL speichert

Das ist wesentlich ressourcenfreundlicher und deine MySQL wirds dir auch danken.

Gruß Stefan
von raiserle
naja, ist bissel viel jetz. hab den code einfach mal rauskopiert.
ich lad die bilder zb auf tripod hoch und benutz nen anderen webserver...
meinen eignen local-webserver...
ich schreiben die daten, die benötigt werden in die mysql...
welcher tripod-acc usw... es funktioniert echt super.
falls ihr irgendwo nicht klar kommt, oder ein modifiziertes script braucht,
einfach nochmal fragen.
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: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: 
36: 
37: 
38: 
39: 
40: 
41: 
42: 
43: 
44: 
45: 
46: 
47: 
48: 
49: 
50: 
51: 
52: 
53: 
54: 
55: 
56: 
57: 
58: 
59: 
60: 
61: 
62: 
63: 
64: 
65: 
66: 
67: 
68: 
69: 
70: 
71: 
72: 
73: 
74: 
75: 
76: 
77: 
78: 
79: 
80: 
81: 
82: 
83: 
84: 
85: 
86: 
87: 
88: 
89: 
90: 
91: 
92: 
93: 
94: 
95: 
96: 
97: 
98: 
99: 
100: 
101: 
102: 
103: 
104: 
105: 
106: 
107: 
108: 
109: 
110: 
111: 
112: 
113: 
114: 
115: 
116: 
117: 
118: 
119: 
120: 
121: 
122: 
123: 
124: 
125: 
126: 
127: 
128: 
129: 
130: 
131: 
132: 
133: 
134: 
135: 
136: 
137: 
138: 
139: 
140: 
141: 
142: 
143: 
144: 
145: 
146: 
147: 
148: 
149: 
150: 
151: 
152: 
153: 
154: 
155: 
156: 
157:
<?php
session_start();
##################################################
# FTP Verbindung zu einem Server herstellen      #
# H. Raböse                                      #
# 17. 05. 2005                                   #
# v 1.0                                          #
##################################################
?>
 <body onunload="mywin.close()">
<script LANGUAGE="javascript">
function popup()
{
 mywin = window.open("timer.htm","untitled","width=310,height=400,left=0,top=0");
}
</script>
<?php
require"image.func.php";

$cnx=mysql_connect('localhost','**********','**********')or die(mysql_error());
mysql_select_db('index')or die(mysql_error());

$tab_bilderkat="pictures_cat";
$tab_bilder="pictures";

$server="ftp.mitglied.lycos.de";
$port  =21;
$ftpuser="**********";
$ftppass="*********";
$upload="bilder";
$date=time();

if(!$_POST['save']){

    $result=mysql_query("select * from $tab_bilder group by category order by category asc");

    echo"<FORM  action=\"".$_SERVER[PHP_SELF]."\" method=\"POST\" enctype=\"multipart/form-data\">
         Kategorie:
         <SELECT  name=\"cat\">
            <option selected></option>";
            while($row=@mysql_fetch_array($result)){
                echo"<option>".$row['category']."</option>";
            }
    echo"</SELECT> oder neue Kategorie <INPUT TYPE=\"TEXT\"  name=\"catnew\"><br>
         Datei: <input type=\"FILE\" name=\"pic\"><br>
         URL: <input type=\"text\" name=\"url\"><br>
         Beschreibung: <TEXTAREA  name=\"beschreibung\" rows=\"5\" cols=\"20\"></TEXTAREA><br>
         <INPUT TYPE=\"SUBMIT\"  name=\"save\" value=\"Speichern\" onClick=popup()>
         </FORM>";


}

if($_POST['save']){

    /*
    echo "  <script language=javascript>
                mywin = window.open(\"timer.htm\",\"untitled\",\"width=310,height=400,left=0,top=0\");
            </script>";
    */

    $cat    =$_POST['cat'];
    $catnew =$_POST['catnew'];
    $url    =$_POST['url'];


    if($_POST['cat']=="" && $_POST['catnew']==""){
        echo"Es muss eine Kategorie angegeben werden<br>";
        exit();
    }
    if($catnew!="") $cat="";

    $image=getimagesize($_FILES['pic']['tmp_name']);
    //print_r($image);echo"<br>";

    if(!$image[2]==1 || !$image[2]==2 || !$image[2]==3)
    {
        echo"Falsches Format. Nur <b>gif</b>, <b>jpg</b> oder <b>png</b>.<br>";
        exit();
    }
    $name=$_FILES['pic']['name'];
    $width=$image[0];
    $height=$image[1];

##################################################################
### bild in den tempordner kopieren und mit temp_NAME versehen ###
##################################################################

    copy($_FILES['pic']['tmp_name'],"temp/temp_".$_FILES['pic']['name']);
    $filename1="temp/temp_".$_FILES['pic']['name'];
    echo"Dateigröße=".filesize($filename1)." bytes<br>";
###########################################################################
#### Thumbnail erzeugen und unter thumb_NAME abspeichrn im ordner temp/ ###
###########################################################################
    if(thumbnail($_FILES['pic']['tmp_name'],70,'temp',"thumb_".$_FILES['pic']['name'])!=1){
        copy($_FILES['pic']['tmp_name'],"temp/thumb_".$_FILES['pic']['name']);
    }
    $filename2="temp/thumb_".$_FILES['pic']['name'];


$ftp_id=@ftp_connect($server,$port);
$login=@ftp_login($ftp_id,$ftpuser,$ftppass);
if((!$ftp_id) || (!$login)){
     echo "<br>FTP-Connect faild!<br>";
}
else{
     echo "Connected!<br>";
}
if(!@ftp_chdir($ftp_id,$upload)){               //--> in den bilderordner wecheln
    echo "Directory $upload not found<br>";
}
#############################################
#### Bild wird übermittelt ##################
#############################################
    if($cat!=""){
        ftp_chdir($ftp_id,$cat);                //--> in den categoryordner wecheln
        $category=$cat;
    }//--> alte category nutzen
    else{
        $category=$_POST['catnew'];
        ftp_mkdir($ftp_id,$catnew);             //--> categoryordner erzeugen
        ftp_chdir($ftp_id,$catnew);             //--> in categoryordner wecheln
        ftp_mkdir($ftp_id,"thumb");             //--> ordenr in cat-ordner für thumbnails erstellen
    }//--> neue category anlegen

    mysql_query("insert into $tab_bilder set
                                                name='$name',
                                                dest='$url',
                                                _describe='$beschreibung',
                                                _width='$width',
                                                _height='$height',
                                                category='$category',
                                                _date='$date' ")or die(mysql_error());

    $fp1=fopen($filename1,"r");
    $fp2=fopen($filename2,"r");

    ftp_fput($ftp_id,"$name",$fp1,FTP_BINARY);  //--> Orgbild übertragen
    ftp_chdir($ftp_id,"thumb");                 //--> in thumbordner wechseln
    ftp_fput($ftp_id,"$name",$fp2,FTP_BINARY);  //--> Thumbbild übertragen

    fclose($fp1);
    fclose($fp2);

    unlink($filename1);
    unlink($filename2);

if(ftp_close($ftp_id)) echo "Connetion closed<br>";

echo "  <head>
            <meta http-equiv=\"refresh\" content=\"0; URL=$_SERVER[PHP_SELF]\">
            <!-- ... andere Angaben im Dateikopf ... -->
        </head>";

//echo "<script language=javascript>mywin.close()</script>";
}//-- ende post[save]
?>


gruß raiserle aka Henrik
von zeTo
ich weiß es zwar nicht, aber ich könnte mir vorstellen, dass es genau so ist, wie beim email mit anhang versenden mit php.
d.h. man muss es erst encode:

base64_encode($file_data)

aber wie gesagt, ich hab keine ahnung, ich hab so was noch nie gemacht...
von jans16
DIe Bilder die ich testweise mit phpMyAdmin in die DB hochgeladen habe konnte ich auch einfach mit folgender bild.php (gekürzt) ausgeben:
1: 
2:
header("Content-Type: image/".$dsatz['format']);
echo $dsatz['bild'];

Aber bei dem oben gegannten PHP-Code landet gar nichts in der DB.
Mit außnahme, wenn es sich bei der hochgeladenen Bild-Datei nicht wirklich um ein Bild handelt also eine 0 Byte Datei oder eine Text-Datei die 'nur' *.jpg heißt.
Deshalb muss doch warscheinlich noch eine Umwandlung des Strings stattfinden, bevor er an die DB geschrieben wird.

PS: Aus bestimmten Gründen wollte ich eigendlich schon die Bilder selbst in der DB speichern und nicht nur die Pfade, und das sollte doch eigendlich auch mit PHP realisierbar sein...
von pizzataxi
Nur mal als Vorschlag:

Du kannst doch die Pfade zu den hochgeladenen Bildern in der Datenbank speichern.
Das hat den Vorteil, dass Du - wie Rieke schon geschrieben hat - die DB nicht unnötig aufblähst und alle Vorteile von Datenbanken ausnutzen kannst.

Du würdest also zeilenweise die Tabelle auslesen und setzt in den <img> Tag dann den Bildpfad aus der DB.
von Rieke
Ich kann sowas zwar nicht programmieren, aber ich weis das Bilder als text Datei geöffnet eben auch genau aus sollchen Zeichenketten besteht.

Funktioniert die Ausgabe nicht oder landet gar nichts in der DB ?

Noch bessere Frage... warum zur Hölle damit in die DB .. Bilder in die DB zu packen ist Verschwendung, es bläht eine Datenbank unnötig auf .. je aufgeblähter die DB ist um so mehr Performance geht flöten... in den meißten referenzbüchern wird davon abgeraten und das zu Recht
von jans16
Hallo!
Ich wollte gern Bilder vom Upload per PHP in einer MySQL Datenbank speichern.
Habe das mit folgenden PHP-Code Veruscht:
(der Name vom File-Formularfeld heißt 'bild', und ein weiteres Text-Feld 'bild_name')
1: 
2: 
3: 
4: 
5: 
6:
$format = substr($_FILES['bild']['type'],6);
$handle = fopen ($_FILES['bild']['tmp_name'], "rb");
$datei = fread($handle, filesize($_FILES['bild']['tmp_name']));
fclose ($handle);
$sql = 'INSERT INTO `bilder` (`name`, `bild`, `format`) VALUES ("'.$bild_name.'", "'.$datei.'", "'.$format.'")';
mysql_query($sql);

Ich habe es auch schon mit
1:
$datei = file_get_contents($_FILES['bild']['tmp_name']);

versucht, leider ohne erfolg.
Wenn ich Test-Weise $datei ausgebe bekomme ich solch Zeichenketten ÒØ\¯”îΪACwØÝûuúU *W
Der Feld-Typ von 'bild' in der DB ist "mediumblob"
Hat jemand ne Idee was ich da noch falsch mache???
Gruß Jan

Nach oben