上传图片的困惑 $query="insert into t_personalpub(f_usercode,f_photo1) values('$f_user','$imagecontent')";试试 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 把读出来的文件用base64_encode算一下再放到数据库吧 哇塞,老兄这样的代码怎这样写$file_name = "D:\\phproot\\rencai.jpg";...if ($fp = fopen($file_name, "r")){ $buf = fread($fp, $psize); fclose($fp); //开了的句柄要关}else $buf = 0;if ($buf){ $imagecontent = addslashes($buf); //光addslashes()好像还不行,ASCII在31以下的好像会有问题,自己试试... sybase_query(...);} 这种问题我遇到过:因为图片中存在一些字符,会让数据库产生误解所以把读出来的文件用base64_encode算一下再放到数据库读文件的时候用base64_decode函数解码<? include("phpdb.php"); //连接数据库 //将读入的图片上传数据库 $f_user="3711"; $file_name="D:\phproot\\rencai.jpg"; $psize=filesize($file_name); $imagecontent=base64_encode(addslashes(fread(fopen($file_name,"r"),$psize))); $query="insert into t_personalpub(f_usercode,f_photo1) values ('$f_user','$imagecontent')"; if($file_name!="none" and $file_name!="") { sybase_query($query) or die("Can't Perform Query");//第12行 } ?> 1、表t_personalpub的f_photo1字段必须能存储二进制数据2、$file_name="D:\phproot\\rencai.jpg"; $psize=filesize($file_name); $imagecontent=addslashes(fread(fopen($file_name,"r"),$psize));改成 $file_name="D:\\phproot\\rencai.jpg"; $imagecontent=addslashes(fread(fopen($file_name,"rb"),filesize($file_name)));linux下可以不要“b”,按你的路径描述应该是在win下 远程数据库所用为sybase,操作系统为LINUX本地所用操作系统为WINDOWS SERVER 2000数据库中相关图片字段为IMAGE类型今天实验后,发现可以顺利的往数据库中提交数据,但再从数据库中输出数据时,页面无图象显示,只显示数字“20”,打开SYBASE 数据库查看,发现该图象字段中数据为”0X20“,初步分析,怀疑可能是数据库未能有效的接受数据。(正常该字段应该显示很长的16进制的数)// 修改后的数据库上传图片代码:upload.php<? include("phpdb.php"); //将读入的图片上传数据库 $f_user="3711"; $file_name="D:\\phproot\\rencai.jpg"; echo "file=$file_name"; $psize=filesize($file_name); if ($fp=fopen($file_name,"rb")) { $buf=fread($fp,$psize); fclose($fp); } else $buf=0; if($buf=0) { $imagecontent=addslashes($buf); $imagecontent = base64_encode($imagecontent); //base64_encode函数,加与不加均已试过,但都不行。 } $query="insert into t_personalpub(f_usercode,f_photo1) values ('$f_user','$imagecontent')"; if($file_name!="none" and $file_name!="") { sybase_query($query) or die("Can't Perform Query"); } ?>// 从页面中显示图片代码:showpic.php<?php include("phpdb.php"); header("Content-type: image/jpeg"); $f_usercode="3711"; $sql_str="select * from t_personalpub where f_usercode='$f_usercode'"; $query=sybase_query($sql_str); if($rs=sybase_fetch_array($query)) { $picdata= $rs[f_photo1] ; $picdata= base64_decode($rs[f_photo1]) ; } echo $picdata;?> 以RB方式打开文件,也试了,但还是存在那个问题 $imagecontent=addslashes(fread(fopen($file_name,"rb"),filesize 由于我没有用过sybase,所以只能提出一般性建议:先判断问题出在哪一段。在入库后,把$imagecontent写入到文件输出时,用文件内容代替$picdata若成功说明问题可能出在数据库或传输上,因为数据库是远程的 ....//if($buf=0) //<--这里错了if ($buf) //或if ($buf!=0){ //$imagecontent = addslashes($buf); //去掉它吧 $imagecontent = base64_encode($buf); $query="insert into t_personalpub (f_usercode,f_photo1) values ('$f_user','$imagecontent')"; sybase_query($query) or die("Can't Perform Query");} BASE64编码是最好的解决办法以前我都用XMLRPC通过BASE64编码传图片,一点问题都没有 不错manyou(他山之石) 的方法值得一试addslashes是与mysql相容的函数,不同数据库需要转义的字符并不相同比如foxpro 需转义 “\r” => “” Access 需转义 “'” => “''” 你用base64方法通不过可能是字段类型有问题:将' " \用正则表达式替换为\' \" \\再存入数据库:$imagecontent = str_replace("\\", "\\\\", $imagecontent); //"\" -> "\\"$imagecontent = str_replace("'", "\\'", $imagecontent); //"'" -> "\'"$imagecontent = str_replace('"', "\\\"", $imagecontent); //""" -> "\"" 非常感谢大家的关注和指点,今天我又试了试,一种是套用正则表达式,一种是以FORM表单的方式,但两者运行后,输入到数据库中的数据都是OX20,我感觉诸位对我的指点已经够到家的了,可为什么我总是没能很好的把它调试出来,看来我真得尽快努力提高自己的技术水平! /////////////////////////////////<? // 采用正则表达式,upload.php // ///////////////////////////////// include("phpdb.php"); //将读入的图片上传数据库 $f_user="3724"; $file_name="D:\\phproot\\rencai.jpg"; //echo "file=$file_name"; $psize=filesize($file_name); //echo"size= $psize"; if ($fp=fopen($file_name,"r")) { $buf=fread($fp,$psize); fclose($fp); } else $buf=0; if($buf) { //$imagecontent = base64_encode($imagecontent);加与不加,均已试过,都不行 $imagecontent = str_replace("\\", "\\\\", $imagecontent); //"\" -> "\\" $imagecontent = str_replace("'", "\\'", $imagecontent); //"'" -> "\'" $imagecontent = str_replace('"', "\\\"", $imagecontent); //""" -> "\"" } $query="insert into t_personalpub(f_usercode,f_photo1) values ('$f_user','$imagecontent')"; if($file_name!="none" and $file_name!="") { sybase_query($query) or die("Can't Perform Query"); } ?> //////////////////////////////////////<? // 采用FORM表单的方式,来上传图片 // //////////////////////////////////////if($confirm) { //存储图片数据//读入上传的图片数据 include("phpdb.php"); //将读入的图片上传数据库 $f_user="3706"; //$file_name="D:\\phproot\\rencai.jpg"; //echo "file=$file_name"; $psize=filesize($file_name); //echo"size= $psize"; if ($fp=fopen($file_name,"r")) { $buf=fread($fp,$psize); fclose($fp); } else $buf=0; if($buf) { $imagecontent = base64_encode($imagecontent); // echo "$imagecontent"; } $query="insert into t_personalpub(f_usercode,f_photo1) values ('$f_user','$imagecontent')"; if($file_name!="none" and $file_name!="") { sybase_query($query) or die("Can't Perform Query"); }}?><!-- 文件提交表单: --><form name="form1" method="post" action="" enctype="multipart/form-data"> <input type="file" name="file_name"> <input type="submit" name="confirm" value="Submit"></form>问题1: 采用FORM表单的方式,来上传图片,该方式未调试通过,但能往数据库写信息,系统提示出错,什么意思? f_usercode 为主键,且没有重复值//Warning: sybase_query() [function.sybase-query]: Sybase: Server message: Attempt to insert duplicate //key row in object 't_personalpub' with unique index 't_personal_f_user_16570569391' (severity 14, //procedure N/A) in D:\phproot\upload.php on line 25//Warning: sybase_query() [function.sybase-query]: Sybase: Server message: Command has been aborted. //(severity 10, procedure N/A) in D:\phproot\upload.php on line 25//Can't Perform Query问题2:上传图片是否必须以FORM表单提交的方式?问题3:下一步我该从哪个方面找问题?该图象字段为IMAGE类型,不应该会有太短的字符长度限制吧。 //$imagecontent = base64_encode($imagecontent);加与不加,均已试过,都不行当然不行啦,是:$imagecontent = base64_encode($buf);!!!下一步你该去学怎样编写程序!!! 网友nhconch(海风轻拂) ,教训的很对,一个人本来技术不行就够呛的了,还这么粗心,真的是不能原谅,我无地自容,我以后一定注意,不可以再犯这种低级错误!代码我改了,并经过了调试,所遇到的问题还是那几个。诸位无论对我指点,还是批评,只要是说的对,那对我就是莫大的帮助!我都由衷的感谢你们对我的帮助! /////////////////////////////////<? // 采用正则表达式,upload.php // ///////////////////////////////// include("phpdb.php"); //将读入的图片上传数据库 $f_user="3724"; $file_name="D:\\phproot\\rencai.jpg"; //echo "file=$file_name"; $psize=filesize($file_name); //echo"size= $psize"; if ($fp=fopen($file_name,"r")) { $buf=fread($fp,$psize); fclose($fp); } else $buf=0; if($buf) { $imagecontent=$buf; $imagecontent = str_replace("\\", "\\\\", $imagecontent); //"\" -> "\\" $imagecontent = str_replace("'", "\\'", $imagecontent); //"'" -> "\'" $imagecontent = str_replace('"', "\\\"", $imagecontent); //""" -> "\"" } $query="insert into t_personalpub(f_usercode,f_photo1) values ('$f_user','$imagecontent')"; if($file_name!="none" and $file_name!="") { sybase_query($query) or die("Can't Perform Query"); } ?> //////////////////////////////////////<? // 采用FORM表单的方式,来上传图片 // //////////////////////////////////////if($confirm) { //存储图片数据//读入上传的图片数据 include("phpdb.php"); //将读入的图片上传数据库 $f_user="3706"; //$file_name="D:\\phproot\\rencai.jpg"; //echo "file=$file_name"; $psize=filesize($file_name); //echo"size= $psize"; if ($fp=fopen($file_name,"r")) { $buf=fread($fp,$psize); fclose($fp); } else $buf=0; if($buf) { $imagecontent=$buf; $imagecontent = base64_encode($imagecontent); // echo "$imagecontent"; } $query="insert into t_personalpub(f_usercode,f_photo1) values ('$f_user','$imagecontent')"; if($file_name!="none" and $file_name!="") { sybase_query($query) or die("Can't Perform Query"); }}?><!-- 文件提交表单: --><form name="form1" method="post" action="" enctype="multipart/form-data"> <input type="file" name="file_name"> <input type="submit" name="confirm" value="Submit"></form> php读取csv excel问题 友情链接批量查询程序的正则表达式,求高手帮忙 php用什么表示IsPostBack? 跳转时闪一下,怎么办? 请教一个读出<td></td>间字符的正则表达式! 我用ftp传输文件,为什么在本地不能读和写?(急) 请问高手PHP的session是怎么来创建的,怎么好象比asp还麻烦的???? 各位大神关于CURL模拟登录的问题 在图像中绘制文字 socket通信 php作为客户端,C++作为服务端通信问题。。。 怎样统计在线人数的? 小弟是搞java的,想用php做一个小小的个人主页,不想用jsp,碰到一个小小的问题!请指教
$file_name = "D:\\phproot\\rencai.jpg";
...
if ($fp = fopen($file_name, "r"))
{
$buf = fread($fp, $psize);
fclose($fp); //开了的句柄要关
}
else
$buf = 0;
if ($buf)
{
$imagecontent = addslashes($buf);
//光addslashes()好像还不行,ASCII在31以下的好像会有问题,自己试试
...
sybase_query(...);
}
因为图片中存在一些字符,会让数据库产生误解
所以
把读出来的文件用base64_encode算一下再放到数据库
读文件的时候用base64_decode函数解码<?
include("phpdb.php"); //连接数据库
//将读入的图片上传数据库
$f_user="3711";
$file_name="D:\phproot\\rencai.jpg";
$psize=filesize($file_name);
$imagecontent=base64_encode(addslashes(fread(fopen($file_name,"r"),$psize))); $query="insert into t_personalpub(f_usercode,f_photo1)
values ('$f_user','$imagecontent')";
if($file_name!="none" and $file_name!="")
{
sybase_query($query) or die("Can't Perform Query");//第12行
}
?>
2、$file_name="D:\phproot\\rencai.jpg";
$psize=filesize($file_name);
$imagecontent=addslashes(fread(fopen($file_name,"r"),$psize));
改成
$file_name="D:\\phproot\\rencai.jpg";
$imagecontent=addslashes(fread(fopen($file_name,"rb"),filesize($file_name)));
linux下可以不要“b”,按你的路径描述应该是在win下
本地所用操作系统为WINDOWS SERVER 2000
数据库中相关图片字段为IMAGE类型今天实验后,发现可以顺利的往数据库中提交数据,但再从数据库中输出数据时,
页面无图象显示,只显示数字“20”,打开SYBASE 数据库查看,发现该图象字段中数据
为”0X20“,初步分析,怀疑可能是数据库未能有效的接受数据。
(正常该字段应该显示很长的16进制的数)// 修改后的数据库上传图片代码:upload.php
<?
include("phpdb.php"); //将读入的图片上传数据库 $f_user="3711";
$file_name="D:\\phproot\\rencai.jpg";
echo "file=$file_name";
$psize=filesize($file_name);
if ($fp=fopen($file_name,"rb"))
{
$buf=fread($fp,$psize);
fclose($fp);
}
else
$buf=0;
if($buf=0)
{
$imagecontent=addslashes($buf);
$imagecontent = base64_encode($imagecontent);
//base64_encode函数,加与不加均已试过,但都不行。
}
$query="insert into t_personalpub(f_usercode,f_photo1) values ('$f_user','$imagecontent')";
if($file_name!="none" and $file_name!="")
{
sybase_query($query) or die("Can't Perform Query");
}
?>// 从页面中显示图片代码:showpic.php
<?php
include("phpdb.php");
header("Content-type: image/jpeg");
$f_usercode="3711";
$sql_str="select * from t_personalpub where f_usercode='$f_usercode'";
$query=sybase_query($sql_str);
if($rs=sybase_fetch_array($query))
{
$picdata= $rs[f_photo1] ;
$picdata= base64_decode($rs[f_photo1]) ;
}
echo $picdata;
?>
$imagecontent=addslashes(fread(fopen($file_name,"rb"),filesize
先判断问题出在哪一段。
在入库后,把$imagecontent写入到文件
输出时,用文件内容代替$picdata
若成功说明问题可能出在数据库或传输上,因为数据库是远程的
//if($buf=0) //<--这里错了
if ($buf) //或if ($buf!=0)
{
//$imagecontent = addslashes($buf); //去掉它吧
$imagecontent = base64_encode($buf);
$query="insert into t_personalpub (f_usercode,f_photo1) values ('$f_user','$imagecontent')";
sybase_query($query) or die("Can't Perform Query");
}
manyou(他山之石) 的方法值得一试addslashes是与mysql相容的函数,不同数据库需要转义的字符并不相同
比如foxpro 需转义 “\r” => “”
Access 需转义 “'” => “''”
将' " \用正则表达式替换为\' \" \\再存入数据库:$imagecontent = str_replace("\\", "\\\\", $imagecontent); //"\" -> "\\"
$imagecontent = str_replace("'", "\\'", $imagecontent); //"'" -> "\'"
$imagecontent = str_replace('"', "\\\"", $imagecontent); //""" -> "\""
/////////////////////////////////
<? // 采用正则表达式,upload.php //
/////////////////////////////////
include("phpdb.php"); //将读入的图片上传数据库
$f_user="3724";
$file_name="D:\\phproot\\rencai.jpg";
//echo "file=$file_name";
$psize=filesize($file_name);
//echo"size= $psize";
if ($fp=fopen($file_name,"r"))
{
$buf=fread($fp,$psize);
fclose($fp);
}
else
$buf=0;
if($buf)
{
//$imagecontent = base64_encode($imagecontent);加与不加,均已试过,都不行
$imagecontent = str_replace("\\", "\\\\", $imagecontent); //"\" -> "\\"
$imagecontent = str_replace("'", "\\'", $imagecontent); //"'" -> "\'"
$imagecontent = str_replace('"', "\\\"", $imagecontent); //""" -> "\""
}
$query="insert into t_personalpub(f_usercode,f_photo1) values ('$f_user','$imagecontent')";
if($file_name!="none" and $file_name!="")
{
sybase_query($query) or die("Can't Perform Query");
}
?>
//////////////////////////////////////
<? // 采用FORM表单的方式,来上传图片 //
//////////////////////////////////////if($confirm)
{ //存储图片数据//读入上传的图片数据
include("phpdb.php"); //将读入的图片上传数据库
$f_user="3706";
//$file_name="D:\\phproot\\rencai.jpg"; //echo "file=$file_name";
$psize=filesize($file_name); //echo"size= $psize";
if ($fp=fopen($file_name,"r"))
{
$buf=fread($fp,$psize);
fclose($fp);
}
else
$buf=0;
if($buf)
{
$imagecontent = base64_encode($imagecontent);
// echo "$imagecontent"; }
$query="insert into t_personalpub(f_usercode,f_photo1) values ('$f_user','$imagecontent')";
if($file_name!="none" and $file_name!="")
{
sybase_query($query) or die("Can't Perform Query");
}
}
?>
<!-- 文件提交表单: -->
<form name="form1" method="post" action="" enctype="multipart/form-data">
<input type="file" name="file_name">
<input type="submit" name="confirm" value="Submit">
</form>问题1: 采用FORM表单的方式,来上传图片,该方式未调试通过,但能往数据库写信息,系统提示出错,什么意思?
f_usercode 为主键,且没有重复值
//Warning: sybase_query() [function.sybase-query]: Sybase: Server message: Attempt to insert duplicate //key row in object 't_personalpub' with unique index 't_personal_f_user_16570569391' (severity 14, //procedure N/A) in D:\phproot\upload.php on line 25//Warning: sybase_query() [function.sybase-query]: Sybase: Server message: Command has been aborted. //(severity 10, procedure N/A) in D:\phproot\upload.php on line 25
//Can't Perform Query
问题2:上传图片是否必须以FORM表单提交的方式?
问题3:下一步我该从哪个方面找问题?该图象字段为IMAGE类型,不应该会有太短的字符长度限制吧。
当然不行啦,是:$imagecontent = base64_encode($buf);!!!下一步你该去学怎样编写程序!!!
/////////////////////////////////
<? // 采用正则表达式,upload.php //
/////////////////////////////////
include("phpdb.php"); //将读入的图片上传数据库
$f_user="3724";
$file_name="D:\\phproot\\rencai.jpg";
//echo "file=$file_name";
$psize=filesize($file_name);
//echo"size= $psize";
if ($fp=fopen($file_name,"r"))
{
$buf=fread($fp,$psize);
fclose($fp);
}
else
$buf=0;
if($buf)
{
$imagecontent=$buf;
$imagecontent = str_replace("\\", "\\\\", $imagecontent); //"\" -> "\\"
$imagecontent = str_replace("'", "\\'", $imagecontent); //"'" -> "\'"
$imagecontent = str_replace('"', "\\\"", $imagecontent); //""" -> "\""
}
$query="insert into t_personalpub(f_usercode,f_photo1) values ('$f_user','$imagecontent')";
if($file_name!="none" and $file_name!="")
{
sybase_query($query) or die("Can't Perform Query");
}
?>
//////////////////////////////////////
<? // 采用FORM表单的方式,来上传图片 //
//////////////////////////////////////if($confirm)
{ //存储图片数据//读入上传的图片数据
include("phpdb.php"); //将读入的图片上传数据库
$f_user="3706";
//$file_name="D:\\phproot\\rencai.jpg"; //echo "file=$file_name";
$psize=filesize($file_name); //echo"size= $psize";
if ($fp=fopen($file_name,"r"))
{
$buf=fread($fp,$psize);
fclose($fp);
}
else
$buf=0;
if($buf)
{
$imagecontent=$buf;
$imagecontent = base64_encode($imagecontent);
// echo "$imagecontent"; }
$query="insert into t_personalpub(f_usercode,f_photo1) values ('$f_user','$imagecontent')";
if($file_name!="none" and $file_name!="")
{
sybase_query($query) or die("Can't Perform Query");
}
}
?>
<!-- 文件提交表单: -->
<form name="form1" method="post" action="" enctype="multipart/form-data">
<input type="file" name="file_name">
<input type="submit" name="confirm" value="Submit">
</form>