php 图片以二进制流的形式存入数据库。并且能显示出来。
<p>php 图片以二进制流的形式存入数据库。并且能显示出来。</p><p><img src="http://img.baidu.com/img/iknow/icn_point.gif"> 悬赏分:100 -</p>
<p>解决时间:2010-3-4 12:31</p>
<p>就是我想上专一些图片,想把它以二进制的形式存mysql数据库里</p>
<p>然后,我在php代码里如何写,才能把它们再读出来呢。</p>
<p>谢谢哪位大侠帮帮忙哦。</p>
<p>提问者: nono_2000 - 四级</p>
<p>最佳答案</p>
<p>怎样在mysql中存储比较大的图片?</p>
<p>如果你想把二进制的数据,比如说图片文件和HTML文件,直接保存在你的MySQL数据库,那么这篇文章就是为你而写的!我将告诉你怎样通过HTML表单来储存这些文件,怎样访问和使用这些文件。</p>
<p>一、本文概述</p>
<p>本文的主要内容如下:</p>
<p>*在MySQL中建立一个新的数据库</p>
<p>*一个怎样储存文件的例子程序</p>
<p>*一个怎样访问文件的例子程序</p>
<p>二、在MySQL中建立一个新的database</p>
<p>首先,你必须在你的MySQL中建立一个新的数据库,我们将会把那些二进制文件储存在这个数据库里。在例子中我会使用下列结构,为了建立数据库,你必须做下列步骤:</p>
<p>1.进入MySQL控制器</p>
<p>2.输入命令"createdatabasebinary_data;"</p>
<p>3.输入命令"usebinary_data;"</p>
<p>输入如下命令:</p>
<p>"CREATETABLEbinary_data(idINT(4)NOTNULLAUTO_INCREMENTPRIMARYKEY,descriptionCHAR(50),bin_dataLONGBLOB,filenameCHAR(50),filesizeCHAR(50),filetypeCHAR(50));"(不能断行)</p>
<p>如果没有意外,数据库和表应该建立好了。</p>
<p>三、一个怎样储存文件的例子程序</p>
<p>用这个例子你可以通过Html表单将文件传输到数据库中。</p>
<p>store.php3</p>
<p>//store.php3-byFlorianDittmer</p>
<p>?></p>
<p>//如果提交了表单,代码将被执行:</p>
<p>if($submit){</p>
<p>//连接到数据库</p>
<p>//(你可能需要调整主机名,用户名和密码)</p>
<p>MYSQL_CONNECT("localhost","root","password");</p>
<p>MySQL_select_db("binary_data");</p>
<p>$data=addslashes(fread(fopen($form_data,"r"),filesize($form_data)));</p>
<p>$result=MYSQL_QUERY("INSERTINTObinary_data(description,bin_data,filename,filesize,filetype)VALUES(\'$form_description\',\'$data\',\'$form_data_name\',\'$form_data_size\',\'$form_data_type\')");</p>
<p>$id=MySQL_insert_id();</p>
<p>print"ThisfilehasthefollowingDatabaseID:$id";</p>
<p>MYSQL_CLOSE();</p>
<p>}else{</p>
<p>//否则显示储存新数据的表单</p>
<p>?></p>
<p>@MySQL_select_db("binary_data");</p>
<p>$query="selectbin_data,filetypefrombinary_datawhereid=$id";</p>
<p>$result=@MYSQL_QUERY($query);</p>
<p>$data=@MYSQL_RESULT($result,0,"bin_data");</p>
<p>$type=@MYSQL_RESULT($result,0,"filetype");</p>
<p>Header("Content-type:$type");</p>
<p>echo$data;</p>
<p>};</p>
<p>?></p>
<p>程序必须知道要访问那个文件,你必须将ID作为一个参数。</p>
<p>例如:一个文件在数据库中的ID为2.你可以这样调用它:getdata.php3?id=2</p>
<p>如果你将图片储存在数据库里,你可以向调用图片一样调用它。</p>
<p>Example:一个图片文件在数据库中的ID为3.你可以这样调用它:</p>
<p>五、怎样储存大于1MB的文件</p>
<p>如果你想储存大于1MB的文件,你必须对你的程序、PHP设置、SQL设置进行许多修改。</p>
<p>下面几条也许可以帮助你储存小于24MB的文件:</p>
<p>1)修改store.php3,将MAX_FILE_SIZE的值改成24000000。</p>
<p>2)修改你的PHP设置,在一般情况下,PHP只允许小于2MB的文件,你必须将max_filesize(在php.ini中)的值改成24000000</p>
<p>3)去掉MYSQL的数据包大小限制,在一般情况下MYSQL小于1MB的数据包。</p>
<p>4)你必须用以下参数重启你的MYSQL:/usr/local/bin/safe_MySQLd-Okey_buffer=16M-Otable_cache=128-Osort_buffer=4M-Orecord_buffer=1M-Omax_allowed_packet=24M</p>
<p>5)如果仍然出错:可能是超时错误,如果你通过一个很慢的连接来储存一个很大的文件,PHP缺省的时间限制为30秒。你可以将max_execution_time(在php.ini中)的值改为-1</p>
<p>下面是一个老外写的,可以读</p>
<p>SavingImagesinMySQL</p>
<p>Sometimes,it\'smoreconvenienttosaveimagesinadatabasethanasfiles.</p>
<p>MySQLandPHPmakeitveryeasytodothis.Inthisarticle,Iwilldescribe</p>
<p>howtosaveimagesinaMySQLdatabaseanddisplaythemlateron.</p>
<p>Settingupthedatabase</p>
<p>Thedifferencebetweenanyregulartextorintegerfieldsandafieldthat</p>
<p>needstosaveanimageistheamountofdatathatisneededtobeheldinthe</p>
<p>field.MySQLusesspecialfieldstoholdlargeamountsofdata.Thesefields</p>
<p>areknownasblobs(blob).</p>
<p>HereistheBLOBdefinitionfromtheMySQLsite:</p>
<p>ABLOBisabinarylargeobjectthatcanholdavariableamountofdata.The</p>
<p>fourBLOBtypesTINYBLOB,BLOB,MEDIUMBLOBandLONGBLOBdifferonlyinthe</p>
<p>maximumlengthofthevaluestheycanhold</p>
<p>FormoreinformationaboutMySQLBLOBscheckouthttp://www.mysql.net/Manual_c</p>
<p>hapter/manual_Reference.html#BLOB</p>
<p>Usethenextsyntaxtocreateabasictablethatwillholdtheimages:</p>
<p>CREATETABLEImages(</p>
<p>PicNumintNOTNULLAUTO_INCREMENTPRIMARYKEY,</p>
<p>ImageBLOB</p>
<p>);</p>
<p>Settingtheuploadscript</p>
<p>AnexampleofafileuploadfrontendcanbeseenatFileUploadingbyberber</p>
<p>(29/06/99).WhatweneednowisthePHPscriptthatwillgetthefileand</p>
<p>insertitintoMySQL.Thenextscriptdoesjustthat.Inthescript,I\'m</p>
<p>assumingthatthenameofthefilefieldis"icture".</p>
<p><?</p>
<p>If($Picture!="none"){</p>
<p>$PSize=filesize($Picture);</p>
<p>$mysqlPicture=addslashes(fread(fopen($Picture,"r"),$PSize));</p>
<p>unlink($Picture);</p>
<p>mysql_connect($host,$username,$password)</p>
<p>ordie("UnabletoconnecttoSQLserver");</p>
<p>@mysql_select_db($db)</p>
<p>ordie("Unabletoselectdatabase");</p>
<p>mysql_query("INSERTINTOImages(Image)VALUES\'($mysqlPicture\')")</p>
<p>ordie("Can\'tPerformQuery");</p>
<p>}</p>
<p>else{</p>
<p>echo"Youdidnotuploadanypicture";</p>
<p>}</p>
<p>?></p>
<p>Thisisallthatisneededtoentertheimageintothedatabase.Notethatin</p>
<p>somecasesyoumightgetanerrorwhenyoutrytoinserttheimageinto</p>
<p>MySQL.Insuchacaseyoushouldcheckthemaximumpacketsizeallowedby</p>
<p>yourMySQLver.Itmightbetoosmallandyouwillseeanerroraboutthisin</p>
<p>theMySQLerrorlog.</p>
<p>Whatwedidintheabovefileis:</p>
<p>1.CheckifafilewasuploadedwithIf($Picture!="none").</p>
<p>2.addslashes()tothepicturestreamtoavoideerrorsinMySQL.</p>
<p>3.Deletethetemporaryfile.</p>
<p>3.ConnecttoMySQL,choosethedatabaseandinserttheimage.</p>
<p>DisplayingtheImages</p>
<p>Nowthatweknowhowtogettheimagesintothedatabaseweneedtofigure</p>
<p>outhowtogetthemoutanddisplaythem.Thisismorecomplicatedthan</p>
<p>gettingtheminbutifyoufollowthesestepsyouwillhavethisupand</p>
<p>runninginnotime.</p>
<p>Sinceshowingapicturerequiresaheadertobesent,weseemtobeinan</p>
<p>impossiblesituationinwhichwecanonlyshowonepictureandthanwecan\'t</p>
<p>showanymoreSinceoncetheheadersaresentwecan\'tsendanymoreheaders.</p>
<p>Thisisthetrickypart.Tooutsmartthesystemweusetwofiles.Thefirst</p>
<p>fileistheHTMLtemplatethatknowswherewewanttodisplaytheimage(s).</p>
<p>It\'saregularPHPfile,whichbuildstheHTMLthatcontainsthe<IMG>tags,</p>
<p>aswewanttodisplaythem.Thesecondfileiscalledtoprovidetheactual</p>
<p>filestreamfromthedatabasedirectlyintotheSRCpropertyofthe<IMG></p>
<p>tag.</p>
<p>Thisishowasimplescriptofthefirsttypeshouldlooklike:</p>
<p><HTML></p>
<p><BODY></p>
<p><?</p>
<p>mysql_connect($host,$username,$password)</p>
<p>ordie("UnabletoconnecttoSQLserver");</p>
<p>@mysql_select_db($db)</p>
<p>ordie("Unabletoselectdatabase");</p>
<p>mysql_query("SELECT*FROMImages")</p>
<p>ordie("Can\'tPerformQuery");</p>
<p>While($row=mysql_fetch_object($result)){</p>
<p>echo"<IMGSRC=\"SecondType.php3?PicNum=$row->icNum\">";</p>
<p>}</p>
<p>?></p>
<p></BODY></p>
<p></HTML></p>
<p>WhiletheHTMLisbeingdisplayed,theSecondType.php3fileiscalledfor</p>
<p>eachimagewewanttodisplay.ThescriptiscalledwiththePictureID</p>
<p>(PicNum)whichallowsustofetchtheimageanddisplayit.</p>
<p>TheSecondType.php3filelookslikethis:</p>
<p><?</p>
<p>$result=mysql_query("SELECT*FROMImagesWHEREPicNum=$PicNum")</p>
<p>ordie("Can\'tperformQuery");</p>
<p>$row=mysql_fetch_object($result);</p>
<p>Header("Content-type:image/gif");</p>
<p>echo$row->Image;</p>
<p>?></p>
<p>ThisisthewholetheorybehindimagesandMySQL.Thescriptsinthisexample</p>
<p>arethebasics.Youcannowenhancethesescriptstoincludethumbnails,set</p>
<p>theimagesinvariouspositions,enhancethedatabasetabletoholdanALT</p>
<p>field,Checkthewidthandheightoftheimagesbeforeyouinserttheminto</p>
<p>thedatabaseandkeepthatdatainthetabletooetc...</p>
<p>0</p>
<p>回答者:</p>
<p>mfktxgt - 四级 2010-3-3 16:03</p>
<p>我来评论>></p>
<p>提问者对于答案的评价:</p>
<p>搞定。谢谢哦。</p>
页:
[1]