《2022年mysql存储文件 .pdf》由会员分享,可在线阅读,更多相关《2022年mysql存储文件 .pdf(7页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、上机实验 6 : 在 MySQL 中存储图片本节拟将图片 ( 也可以是任何二进制数据 ) 直接保存到数据库中,通过调用数据库,便可以在网页中显示图片了。在本节中, 需要保存到数据库的图象文件是从浏览器所在的客户端上输入的,为在数据库中保存文件,首先需要在“ netsql ”数据库建立一个名为“ imgstore ”的表。表的结构如下:id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY / 文件存储的 id 号descrp CHAR(50) / 对文件的描述bindata LONGBLOB / 文件内容(二进制数据)filename CHAR(50) /
2、文件名称filesize CHAR(50) / 文件大小fileiype CHAR(50) / 文件类型例 6 - 21 的运行过程中是先执行表单的输入,选择输入的文件和对文件的描述,然后再将数据发给 Web 服务器,实际上执行了文件上载和在数据库存储的过程。但是,该网页一般来说要执行两次, 第一次是表单输入,第二次发送数据。为实现方便,该程序设计时使用的是“倒装”结构,希望读者加以注意。【例 6 - 21 】图形数据存储源程序 ( 为方便解释, 这里加上了行号,这在实验时无须输入 ) 。? ? ? 在 MySQL 中存储图片 ? ? ? printf (Step0.$submit=.$sub
3、mit.);? / 在语句中插入 是为抑制告警信息显示,若读者希望了解 在此的作用, 可以在实验时将该符号取消? if($submit)? / 如果提交了表单,执行下面代码名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 7 页 - - - - - - - - - ? $db=mysql_connect(localhost,root,sesame) or die( 数据库联接失败! );? mysql_create_db(netsql);? mysql_select_db(
4、netsql); / 通过 PHP 选择当前数据库 netsql? $result=mysql_query(select id from imgstore); / 试从数据表取得测试参数? if (!$result) ? / 如果 count 表不存在,以下语句将通过 PHP 创建该表? $sql=create table imgstore(id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY, descrp CHAR(50),bindata LONGBLOB,filename CHAR(50),filesize CHAR(50),filetype CHA
5、R(50) or die( 数据表创建失败! );? mysql_query($sql); ? $formdata_type=filetype($formdata); / 取得文件类型? $formdata_size=filesize($formdata); / 取得文件的大小? $formdata_name=$formdata; / 将表单传来的文件名传给相应的变量? echo step1.$formdata_type.$formdata_size.$formdata_name.$formdesc.;? $data = addslashes(fread(fopen($formdata,r),
6、 filesize($formdata);? / 为了在 BLOB 字段中存入二进制数据,必须进行“脱敏”处理? / 这里用 addslashes() 将字串中必要的地方加上转义符 /? $sql=INSERT INTO imgstore VALUES (NULL, $formdesc, $data,? $formdata_name, $formdata_size, $formdata_type) ;? echo step2.$sql.;? $result=mysql_query($sql) or die( 数据插入失败 );? $id= mysql_insert_id();? print T
7、his file has the following Database ID. $id;? mysql_close();? 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 7 页 - - - - - - - - - ? else ? / 否则显示储存数据的表单? ? ? ? File Description.? ? ? File to upload/store in database? ? ? ? ? ? 例 6 - 21 程序说明:?第 8 行是一个执行控制开关,在第一
8、次执行本程序时, $submit 为空 ( 实际上尚未定义 ) ,所以程序转向执行第 34 行以后的程序(表单输入);注意从第 32 行到 44 行,形成表单结构体,见图 6 - 5 ;?第 38 行的 标记用于输入对文件的描述;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 7 页 - - - - - - - - - ?第 39 行的 标记用于通知服务器对输入文件大小设限,这里限制为 1MB 字节;?第 41 行的 标记用于在浏览器所驻留的主机上查找文件;?在表单提交后
9、,服务器按 标记中规定的处理文件 pict.php( 即该网页本身 ) 对表单提供的数据进行处理;?第 18 、 19 行用 PHP 函数获得一些与文件相关的参数,如文件类型,文件长度等;?第 22 行是一个功能强大的语句,它以“读出”方式打开文件,将内容读出后进行“脱敏”处理,在二进制数据中有必要的地方自动加入转义字符。?第 25 行是把需要存入数据库的数据组织到一个 SQL 的插入语句中。 由第 26 行进行插入操作。例 6 - 21 函数参考:? addslashes : 字符串加入转义符函数语法 : string addslashes(string str);说明:该函数使需要让数据库
10、处理的字符串,引号等加上转义符“ / ”,以便数据库查询及操作 (query) 能顺利进行。这些会被修饰的字符包括单引号“ ”、双引号“ ”、反斜线(backslash ) “ ”以及 NULL 。? Fread : 位组方式读取文件函数语法 : string fread(int fp, int length);说明:该函数从文件读出指定长度的位组或到文件尾 EOF 。例 6 - 21 安排了三个输出语句,让读者在实验时观察网页执行过程中变量的变化过程,以便更深入地了解动态网页和 CGI 程序的工作过程和原理 ( 见图 6-6) 。名师资料总结 - - -精品资料欢迎下载 - - - - -
11、- - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 7 页 - - - - - - - - - 当文件上传至 Web 服务器之后,程序将显示上传的文件的 ID ,请读者记住这个 ID ,以后会有用的。 下面就来看一个访问数据库所存图像文件的例子,用户可以通过该程序访问已经储存的图片文件。【例 6 - 22 】 对数据库内存储的文件进行访问?/ 文件名: get.php 调用方法: get.php?id=if($id) $db=mysql_connect(localhost,root,sesame) or die( 数据库联接失败! );
12、mysql_select_db(netsql); / 通过 PHP 选择当前数据库 netsql$query=select bindata,filetype from imgstore where id=$id;$result = mysql_query($query) or die ( 查询出错! );$data = mysql_result($result,0,bindata); /$type = mysql_result($result,0,filetype);/ 告诉浏览器输出文件的类型Header(Content-type:image/gif);/ 输出数据/echo $type;e
13、cho $data; ?例 6 - 22 的程序说明:例 6 - 22 的调用过程需要在 URL 中输入文件存储的 id 。例 6 - 22 函数参考:header() 向浏览器发送 HTTP 协议的标准头部语法 : int header(string string) ;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 7 页 - - - - - - - - - 说明: HTTP 消息首部 (HTTP message header) 是 Web 服务器以 HTTP 协议传送
14、 HTML 数据到浏览器前所送出的字符串。在 PHP 发送 HTML 数据前, 须先传送所有的 header 数据。注意:传统的 header 一定包含下面三种标头之一,并只能出现一次。Content-Type: xxxx/yyyyLocation: xxxx:yyyy/zzzzStatus: nnn xxxxxx在新 header 规范 (Multipart MIME) 中, HTTP 协议消息的首部( header )可以出现二次以上。以下是 header 函数使用的一些例子,供读者参考。【例 6 - 23 】 将用户重导向 PHP 主网站。【例 6 - 24 】为了让用户每次都能从网站取
15、得最新资料,而不是 Proxy 或 cache 中的资料,可以选择使用下列的 header 之一。header(Expires: Mon, 26 Jul 1997 05:00:00 GMT);header(Last-Modified: . gmdate(D, d M Y H:i:s) . GMT);header(Cache-Control: no-cache, must-revalidate);header(Pragma: no-cache);【例 6 - 25 】 在浏览器显示找不到文档的信息。因篇幅的限制, 我们不打算解释程序中用到的所有函数,需要全面了解的读者请参见本书所附光盘中的相关 ( 电子版 ) 参考文件。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 7 页 - - - - - - - - - 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 7 页 - - - - - - - - -
限制150内