你知道怎样从数据库读出内容,我就省略那部分
//show image php (showimg.php)
<?php
//sql query.....
//假设已经从数据读出内容到$picDate:
//PHP支持三种图像:jpg、gif、png
//你要对应的把下句的image/jpeg换成相应的image/gif、image/png
header("Content-type: image/jpeg");
echo $picData;
?>在html中显示:
//Query Page(Query.htm)
.....
<img src=showimg.php?id=xxxx>
.....
//show image php (showimg.php)
<?php
//sql query.....
//假设已经从数据读出内容到$picDate:
//PHP支持三种图像:jpg、gif、png
//你要对应的把下句的image/jpeg换成相应的image/gif、image/png
header("Content-type: image/jpeg");
echo $picData;
?>在html中显示:
//Query Page(Query.htm)
.....
<img src=showimg.php?id=xxxx>
.....
1,php显示图形是否需要图形库的支持:php_gd.dll;是否需先加载它?
2,”<img src=showimg.php?id=xxxx>“代码中id是否指记录的ID号?
3,我在SYBASE中看到的该照片子段是16进制的数,而“//你要对应的把下句的image/jpeg换成相应的image/gif、image/png”中所说,是否是说将此$picdata以jpeg或gif的格式输出,与该字段的类型没关系如:image,binary,(只要是图象类型)
所写代码如下:
showimg.php部分
<?phpinclude("func.php");
include("phpdb.php"); //打开数据库
//开始对sql语句复职
$sql_str="SELECT t_daoyou.*,t_lyrencai.f_name ,t_lyrencai.f_sex,t_lyrencai.f_xueli ,t_lyrencai.f_photo FROM t_daoyou,t_lyrencai WHERE t_daoyou.f_usercode =t_lyrencai.f_usercode AND t_daoyou.f_usercode='$f_usercode'";$query=sybase_query($sql_str);
if($rs=sybase_fetch_array($query))
{
$picdata= $rs[f_phpoto] ;
}
header("Content-type: image/gif");
echo $picdata;
?>
query.htm部分:<?php
. //前面代码省略...
.
.
echo "f_usercode=$f_usercode";
echo " <img src=showimg.php?f_usercode=$f_usercode width=150 height=200 > ";
?>苦恼中....
数据库中的Image表内容(我用的是mysql,sybase可能稍有不同):
CREATE TABLE Image
(
ID INT UNSIGNED PRIMARY KEY,
Name VARCHAR(64) NOT NULL,
Width INT UNSIGNED DEFAULT 0,
Height INT UNSIGNED DEFAULT 0,
Type ENUM('gif', 'jpeg', 'png') DEFAULT 'gif',
Data BLOB NOT NULL
)//showimg.php
<?php
if ($id!="")
{
require("dbfun.inc");
$sql = new CmysqlDB;
$sql->Connect(); //连接数据库
$sql->Query("SELECT Type, Data FROM Image WHERE ID=$id"); //执行SQL语句,等价于sybase_query()
$sql->Fetch(0); //等价于sybase_fetch_array
$picData = base64_decode($sql->data[Data]); //图像数据存进数据库时经过base64_encode编码
$sql->Close(); //断开数据库连接
//下面代码显示图片
header("Content-type: image/$sql->data[Type]");
echo $picData;
}
?>在HTML页面中要显示ID为1的图片,像下面这样:
<img src=showimg.php?id=1>PS:
建议showimg.php仅用作显示图片,不要SELECT那么多字段
require("imgfun.inc"); //检查文件、读取数据的头文件(自编)
require("dbfun.inc");
$sql = new CmysqlDB;
$sql->Connect();
if ($DelOldImg) $sql->ExeSQL("DELETE FROM Image WHERE ID=$OldImgId");
if ($ImageFile=="" || $ImageFile=="none" || $ImageFile && checkImg($ImageFile) && ($imgBuffer = readFileData($ImageFile, $ImageFile_size))) //函数checkImg()、readFileData()、 getImageInfo()均在imgfun.inc里
{
$ImageId = 0;
//$HasImage = 0;
if ($ImageFile != "" && $ImageFile != "none")
{
$HasImage = 1;
$imgData = base64_encode($imgBuffer);
$img_Info = getImageInfo($ImageFile);
$sql->Query("SELECT MAX(ID) AS ID FROM Image");
$sql->Fetch(0);
$ImageId = $sql->data[ID]+1;
$sql->ExeSQL("INSERT INTO Image VALUES ($ImageId, '$ImageFile_name', $img_Info[width], $img_Info[height], '$img_Info[type]', '$imgData')");
}
else
$HasImage = 0;
...........
echo "<p> 您的供求信息已成功修改</p>";
echo "<p> <a href=member.php?op=4>查看我发布的供求信息</a></p>";
echo "<p> <a href=member.php?op=3>发布新的供求信息</a></p>";
echo "<p> <a href=index.php>返回首页</a></p>";
}
//echo "<img src=showimg.php?ID=$ImageId>";
$sql->Close();//imgfun.inc
....
function readFileData($fileName, $fielSize)
{
if (($fp = fopen($fileName,"r")) && ($buf = fread($fp, $fielSize)))
{
fclose($fp);
return $buf;
}
else
{
echo "文件 $fileName_name 不能读取!<br>";
return 0;
}
}
.......
<?php
include("phpdb.php")
//开始对sql语句复职$f_usercode="370200.0301.00001";//我直接了指定记录的ID号,没传递参数
$sql_str="select t_lyrencai.f_photo from t_lyrencai where t_lyrencai.f_usercode='$f_usercode'";$query=sybase_query($sql_str);
if($rs=sybase_fetch_array($query))
{
$picdata= $rs[f_photo] ;
}
//PHP支持三种图像:jpg、gif、png
//你要对应的把下句的image/jpeg换成相应的image/gif、image/png header("Content-type: image/gif");
//header("Content-type: image/jpeg");
// header("Content-type: image/png");
echo $picdata;
?>
query.html部分
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD><BODY>
<img src="showimg.php" width="760" height="66">
</BODY>
</HTML>
如果能的话,就做成一个文件,作为显示图片的文件,
然后再用html里面象显示图片一样调用这个文件
you try
showimg.php
<?php
include("phpdb.php")
$f_usercode="370200.0301.00001";//我直接了指定记录的ID号,没传递参数
$sql_str="select t_lyrencai.f_photo from t_lyrencai where t_lyrencai.f_usercode='$f_usercode'";$query=sybase_query($sql_str);
if($rs=sybase_fetch_array($query))
{
$picdata= $rs[f_photo] ;
}
$fp = fopen("img.gif","wb"); //文件名自定,后缀按真实图片的类型
fwrite($fp,$picdata);
fclose($fp);然后查看img.gif,若不正常则查看文件信息
导入时进行处理的原因很简单,SQL语句里的都是文本内容,如果picdata里有特殊字符如:'等,就执行不了INSERT、UPDATE等语句,所以导入时进行处理是必然的。你还是先搞清楚吧。大家可以到http://www.gdjd.org/imgtemp/img.php来测试一下,有源程序。
我不想再讨论这个问题。
进展如下:
1 在php中显示本地的图片文件通过,可正常显示。
2 将该显示图片的PHP文件钳入到HTML页中也可以正常显示。
发现问题:
1 ”http://www.gdjd.org/imgtemp/img.php“ 中下载文件为imagetext.rar但文件无法解压缩,程序报错:未知方式于某某文件。
2 将数据库的图片文件往本地图片文件(gif格式)中写,文件的大小由原来的0.4K变为11k,但文件无法浏览,用ACDSEE什么也看不到,用editplus看显示为16进制的数字。
3 尝试用BASE64_decode先解码,则网页的输出由显示16进制的数变为无显示(只有一个”X“,像是图象路径指示错误。
4 尝试用不同的图片类型输出(header(image/gif/jpeg/png)),曾输出16进制的数字,和汉字乱码。
说明:进行了这么多的尝试,我逐渐的认识到确定当初输入数据库图片类型的重要性,我会想办法弄清楚的!// 涉及的原代码:
showpic.php //显示本地的图片,测试成功
<?php$fp = fopen("mime.gif","r+"); //文件名自定,后缀按真实图片的类型
$fpic=fread($fp,filesize("mime.gif"));
header("Content-type: image/gif");
echo $fpic;
?>showInfo.php //显示嵌入的PHP图象文件,测试成功!
<?
...
echo "<a <img src=$rs[f_phpoto] width=150 height=200 > /a>";
echo "f_usercode=$f_usercode";
echo " <img src=showpic.php?f_usercode=$f_usercode width=150 height=200 > ";
...
?>showimage.php //显示数据库的图形文件,和往本地的图片文件写,在此发现很多的错误如上所说。
<?php
include("phpdb.php");
$f_usercode="370200.0301.00001";
$sql_str="select t_lyrencai.f_photo from t_lyrencai where t_lyrencai.f_usercode='$f_usercode'";$query=sybase_query($sql_str);
if($rs=sybase_fetch_array($query))
{
$picdata= $rs[f_photo] ;
//$picdata= base64_decode($rs[f_photo]) ;
} // $picData = base64_decode($picdata);
header("Content-type: image/jpeg");
$fp = fopen("mime.gif","w+"); //
fwrite($fp,$picdata);
echo $picdata;
?>
showimage.php //读取数据库的图形文件,在服务器上形成文件
<?php
include("phpdb.php");$f_usercode="370200.0301.00001";
$sql_str="select t_lyrencai.f_photo from t_lyrencai where t_lyrencai.f_usercode='$f_usercode'";$query=sybase_query($sql_str);
if($rs=sybase_fetch_array($query))
{
$picdata= $rs[f_photo] ;
//$picdata= base64_decode($rs[f_photo]) ;
}
// $picData = base64_decode($picdata);
// header("Content-type: image/jpeg");
$fp = fopen("mime.gif","wb"); //
fwrite($fp,$picdata);
// echo $picdata;
fclose($fp);
?>
<img src=mime.gif>看看是否能显示
若不能,将图片mime.gif下载下来。
1、与原图片比较
2、查看图片文件内容
如果用BASE64_decode函数处理,则页面中的图片筐无法正确显示图象;
当不用BASE64_decode函数处理,则页面中输出16进制的数字串
3 写文件后该文件还是JPEG格式,但无法用图象程序或在网页中正确显示,用EDITPLUS打开,发现都是乱码和未写文件时的乱码风格一样!showimage.php //将数据库中图象字段写文件
<?php
include("phpdb.php"); //读取数据库的图形文件,在服务器上形成文件
$f_usercode="370200.0301.00001";
$sql_str="select t_lyrencai.f_photo from t_lyrencai where t_lyrencai.f_usercode='$f_usercode'";
$query=sybase_query($sql_str);
if($rs=sybase_fetch_array($query))
{
1 $picdata= $rs[f_photo] ;
//$picdata= base64_decode($rs[f_photo]) ;
} header("Content-type: image/jpeg");
echo $picdata;
$fp = fopen("ocean.jpg","wb"); //
fwrite($fp,$picdata);
// fclose($fp);
?>网页部分:
<HTML>
<BODY>
<img src="ocean.jpg" width=150 height=200 >
</BODY>
</HTML>
你应该向原来的人员取图片入库时的编码方法,并写出对应的还原程序,将数据还原后再显示。
base64_decode是对经过base64_encode的数据进行还原用的,若果原数据不是经base64_encode编码,使用base64_decode是错误。
继续努力吧,但是速度要快点,那家公司也不愿意为一个问题浪费那么多时间。
write(rs.f_photo.blobImage("jpeg","","center","150","200","1"));
2 录入照片时采用的ASP,代码如下,但我不懂ASP,请诸位帮我看看,谢了!<HTML>
<HEAD>
<TITLE> New Document </TITLE>
</HEAD><BODY>
<%response.buffer=true
FormSize = Request.TotalBytes
FormData = Request.BinaryRead(FormSize)function ImageUp(formsize,formdata)
bncrlf=chrb(13) & chrb(10)
divider=leftb(formdata,instrb(formdata,bncrlf)-1)
datastart=instrb(formdata,bncrlf&bncrlf)+4
dataend=instrb(datastart+1,formdata,divider)-datastart
imageup=midb(formdata,datastart,dataend)
end functionImage=ImageUp (FormSize,Formdata)
Set strconn = server.createobject("adodb.connection")
set rs=server.CreateObject("adodb.recordset")
strconn.open "driver={sql server};server=;uid=userid;PWD=password;database=daoyou_db"
sql="SELECT * FROM dy_info"
rs.Open sql,strconn,1,3rs.AddNew
rs("f_photo").appendchunk Image
rs.Update
rs.Closeresponse.contenttype="image/gif"
response.binarywrite imageup(formsize,formdata)
%>
</BODY>
</HTML>
bncrlf=chrb(13) & chrb(10) '这是回车换行符
divider=leftb(formdata,instrb(formdata,bncrlf)-1) '取第一个回车换行符的位置
datastart=instrb(formdata,bncrlf&bncrlf)+4 '取接连两个回车换行符的的位置+4(即紧跟该位置后一个位)
dataend=instrb(datastart+1,formdata,divider)-datastart '大概是取剩余的长度
imageup=midb(formdata,datastart,dataend) '从fromdata中取出datastart到dataend之间的内容,并返回
end function<%response.buffer=true
FormSize = Request.TotalBytes
FormData = Request.BinaryRead(FormSize) '读入内容到formdata中
Image=ImageUp (FormSize,Formdata) '取ImageUp取出需要的部分
'下面是通过adodb引擎连接Sql的daoyou_db数据库并选取dy_info表的内容
Set strconn = server.createobject("adodb.connection")
set rs=server.CreateObject("adodb.recordset")
strconn.open "driver={sqlserver};server=;uid=userid;PWD=password;database=daoyou_db"
sql="SELECT * FROM dy_info"
rs.Open sql,strconn,1,3 '接入取得数据并保存(与PHP不同的是,这样可以保存二进制的数据,处理适当当然PHP也可以)
rs.AddNew
rs("f_photo").appendchunk Image
rs.Update
rs.Close '显示图片
response.contenttype="image/gif" '产生文件头
response.binarywrite imageup(formsize,formdata)
%>
应该说,数据库里保存的是图片的图像部分,在PHP里参照它那样读出来显示就行了:
..._query("select f_photo from dy_info where ...");
rs = ..._fetch_array(..);
pciData = rs[f_photo];
header("Content-type: image/jpeg");
echo $picData;是不是,你试试吧,我也不能保证正确
请帮我总结一下知识点:
1 当图片类型的文件往远程数据库存时,肯定要进行适当的编码,在照片从数据库中要显示出来时,要进行相应的解码。
2 php支持的图片有三种:jpeg,png,gif,图片存进数据库中时什么格式,则显示时也要同样的格式。 在公司我是新手,以前学的是VB,现在被安排做PHP的开发,而且我做的这一块用PHP显示数据库的图片的部分,公司里没人先前做过,我的老师也没给我太大的压力,我又要开始准备新的项目了,这块以后漫漫再说吧,我会补习一下相关的知识,相信一定会克服它的!
最后特别感谢 nhconch(海风轻拂) ,(xuzuning(唠叨) ,xizi2002(☆☆戏☆子☆☆) 几位网友给我的帮助,谢谢你们! (我会在三天以后,结贴)
请帮我总结一下知识点:
1 当图片类型的文件往远程数据库存时,肯定要进行适当的编码,在照片从数据库中要显示出来时,要进行相应的解码。
2 php支持的图片有三种:jpeg,png,gif,图片存进数据库中时什么格式,则显示时也要同样的格式。 在公司我是新手,以前学的是VB,现在被安排做PHP的开发,而且我做的这一块用PHP显示数据库的图片的部分,公司里没人先前做过,我的老师也没给我太大的压力,我又要开始准备新的项目了,这块以后漫漫再说吧,我会补习一下相关的知识,相信一定会克服它的!
最后特别感谢 nhconch(海风轻拂) ,(xuzuning(唠叨) ,xizi2002(☆☆戏☆子☆☆) 几位网友给我的帮助,谢谢你们! (我会在三天以后,结贴)