文本编辑器上传图片分类管理方法

原创
2013/12/04 23:09
阅读数 327

有些时候,编辑文章里添加了一些图片,当把这篇文章删除的时候,如果图片分类不做处理就无法删除掉文章里的图片,这样长时间会占用不必要的空间。所以这里提出一个管理图片的方法,仅供参考:

主题思路就是,当接文章提交过来的POST数组的时候把文本编辑器里的内容先过滤掉,把其他信息先insert到数据库,然后再把编辑器的中上传的图片存入到编码好的路径里,再把编辑器里的信息update到刚才的那条里。

下面来具体说说这些步骤:

<!--lang:php-->
//获取编辑器里的内容,并赋给一个变量
$content = $_POST['content'];
unset($_POST['content']);//这样入库的时候就不包含编辑器中的内容
//下面执行插入语句:
eg:$lastId = $article->insert(); // 先插入其他信息,并获取最后插入的ID
 
// 判断插入是否成功(这里引入处理编辑器内容的函数)
if($lastId && $article->aimage($content,$lastId)) {
  echo "文章添加成功!";
}
 

// aimage 函数 
// 因为除了文章上传外 可能很多地方也需要处理图片保存的地方,所以这个最好设置为单独的model 共其他共享
/**
* @params $content 文本信息
* @params $lastId  最后插入的ID
* @params $prefix  文件前缀(用于区分不同功能模块中的图片)
**/
                         
function aimage($content, $lastId, $prefix="") {
  if(rtrim($content)=="") {
    $this->setMsg("内容不能为空");
    return false;
  }                         
                     
//为了入库,先把转义符去掉,再把特殊字符换成实体
$content = str_replace(array("\"", "'"), array("&quot;", "&#039;"), stripslashes($content));
                         
// 这里的SESSION数组,是上传图片的文件名组成的数组 下面再说怎么来的。
if(!empty($_SESSION["article"])){
  // 找到上传文件的路径
  $srcpath = PROJECT_PATH."public/uploads/";
  // 生成自己方便管理的新路径
  $path = $srcpath.$prefix.$lastId.'/'; //这样就细分了图片的归属,而不是大杂烩了
  // 下面遍历存在SESSION里的图片名
  foreach($_SESSION['article'] as $filename) {
                           
  // 把将要出入数据库的文本编辑器里的内容中的图片路径换成新的 
    $content = str_replace($filename, $prefix.$lastId."/".$filename, $content);
                           
  // 如果新目录不存在,则新建一个
    if(!file_exists($path)) {
      mkdir($path);
    }
  // 把上传图片转移到新目录中
  rename($srcpath.$filename, $path.$filename);
  }
  $_SESSION["article"] = array(); // 清空数组,下次再用
}
  // 把编辑器里的文本信息 update 到刚插入的数据里
return $this->where($lastId)->update("content='{$content}'"); 
}
 


// 删除文章的时候,也要删除文章里对应的图片 这里文章前缀默认为空
function delres($id, $prefix="") {
  // 如果是删除文章,则也要删除文章对应所有评论,以及用户对这个文章的操作
  if($prefix=="") {
    D("content")->where(array('aid'=>$id))->delete();
    D("dynamic")->where(array("otype"=>array(1,2,3,4), "cid"=>$id))->delete();
  }
  $directory = PROJECT_PATH."public/uploads/".$prefix.$id.'/';
             
  if(file_exists($directory)) {
    if($dir_handle = @opendir($directory)) {
      while(false!==($filename=readdir($dir_handle))) {
        if($filename!="." && $filename!="..") {
          unlink($directory."/".$filename);
        }
      }
      closedir($dir_handle);
    }
    rmdir($directory);
  }
}

这里补充一下上面的SESSION数组是怎么来的。他是在编辑器本身里的上传文件处理函数里,如果上传成功,则把当前上传的图片名塞入$_SESSION['article'] 这个数组里。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部