文件上传后数据库怎么处理比较好?
收集文件地址比较好.
PS.已经尝试了上传许多文件后,个人认为在数据库中直接放二进制的图片数据会显得很混乱.
有可能因为截断问题把图片搞的很不完整.所以存放路径成为比较理想的方案.
PS.图像地址存放,这个字段的类型选择BLOB原因是便于存放多个文件地址;
加入地址的时候,使用特殊符号分割加入;
提取时候就可以获取多个文件地址了;
先总汇一下这次的任务
任务内容:上传修改用户头像
步骤:
1.user_portrait.php 负责收集用户需要的头像的表单,
如果已经设置过头像那么显示当前的头像.
2.do_user_portrait.php 负责上传至服务器的文件系统中,
并且将文件的相对路径存放到数据库.
通过SESSION保存好传送中发生的问题和数据库写入发生的问题.或者是传送成功的信息.
3.反馈SESSION保存的执行结果到达user_portrait.php.
反馈完毕后 清理相关SESSION值.
第一步:
显示当前的头像.这个头像需要通过检索数据库,找到头像地址,找到这个文件,
选择好HTTP传送格式;
然后再进行绘制打印,
为了便于使用所以写成了函数;
function read_image($file_name,$type)
{
//绘制打印一个图片文件,
//$file_name完整的相对路径,$type格式扩展名.gif,.jpg,.png
if($type==".jpg")
{
$image=ImageCreateFromJPEG($file_name);
header("Content-Type: image/jpeg");
ImageJPEG($image);
}
elseif($type==".png")
{
$image=ImageCreateFromPNG($file_name);
header("Content-Type: image/png");
ImagePNG($image);
}
elseif($type==".gif")
{
$image=ImageCreateFromGIF($file_name);
header("Content-Type: image/gif");
ImageGIF($image);
}
return $image;
}
因为要显示在指定的页面,
所以插入这样的语句就可以显示
<img src="show_img_db.php?user_id=$user_id">
show_img_db.php 这个页面负责的是 :检索数据库,找到头像地址,找到这个文件,分析出文件扩展名;
调用read_image($file_name,$type)来执行打印当前的头像;
那么扩展名可以用这样的函数来获取:
function get_file_name($str)
{
//获得文件的格式扩展名$str为原来的扩展名;
$pos= strrpos($str, ".");
if ($pos !== false)
{
$len=strlen($str)-$pos;
$file_name=substr($str,$pos,$len);
return $file_name;
}
}
show_img_db.php中调用显示图像方法可以这么写;
//检索数据库省略;
$row=mysql_fetch_array($result);
//获取文件格式名
$type_name=get_file_name($row["user_img"]);
//调用图片文件的绘制打印函数
read_image($row["user_img"],$type_name);
第二步:
判断好文件的大小,格式,再执行写入服务器;
由于是头像文件.所以务必设置的小一些,否则会很奇怪.
对于各种问题设定错误信息;反馈到前面一页
//上传图片格式文件到达$save_dir指定目录,$form_elem是文件控件名
$allow_type=array("image/jpeg","image/pjpeg","image/x-png","image/png","image/gif");
$save_dir="user_img"."/";
$max_size=5000;
if(isset($_FILES[$form_elem]))
{
if($_FILES[$form_elem]['size']<=$max_size)
{//长度正确
if(in_array($_FILES[$form_elem]['type'],$allow_type))
{
if($_FILES[$form_elem]['error']==0)
{ //获得图像格式后缀名;例如".gif"
$file_type_name=get_file_name($_FILES[$form_elem]['name']);
//用户头像地址规则:user_img/时间戳_用户名.文件扩展名
$thefile=$save_dir.time()."_".$username.$file_type_name;
if(!move_uploaded_file($_FILES[$form_elem]['tmp_name'],$thefile))
{
//上传失败
$_SESSION['error']['UPDATE_IMG_ERROR']="upload file faild!";
header("Location: user_portrait.php");
exit();
}
else
{
//上传成功
//取出文件地址
$user_img=$thefile;
//传入数据库
if(!$conn=@mysql_connect("localhost","root","1"))
{
die("Could not connect db!");
}
if(!@mysql_select_db("mini_bbs"))
{
show_error();
}
//获取用户编号
$user_id=(int)(get_user_id_from_username($username));
$query="update user
set user_img='$user_img'
where user_id=$user_id";
//执行写入
if(!$result=@mysql_query($query))
{ //写入失败设定UPDATE_IMG_ERROR信息
$_SESSION['error']['UPDATE_IMG_ERROR'].="<br />upload file to db
error!";
header("Location: user_portrait.php");
exit();
}
else
{ //写入成功设定UPDATE_IMG_SUCCESS信息
$_SESSION['error']['UPDATE_IMG_SUCCESS']="update image ok!";
//记录格式扩展名.jpg,.gif,.png
$_SESSION['image']['type']=substr($file_type_name,1,strlen
($file_type_name)-1);
header("Location: user_portrait.php");
exit();
}
}
}
}
else
{ //格式不正确
$_SESSION['error']['UPDATE_IMG_SUCCESS']="ERROR:file type must be:jpeg,gif,png!";
header("Location: user_portrait.php");
exit();
}
}
else
{
//长度太大
$_SESSION['error']['UPDATE_IMG_SUCCESS']="ERROR:the file is too big!";
header("Location: user_portrait.php");
exit();
}
}
总结:
选择数据库来保存地址是有目的的.
因为一个时间用户只能由一个头像地址,也可能希望从自己拥有的头像中选中以前上传过的头像,
也就是服务器端拥有很多用户头像.数据库只要记录下一枚最新修改的头像地址就好了;所以
还是需要数据库来记录这个消息的;