zoukankan      html  css  js  c++  java
  • Discuz模拟批量上传附件发帖

    简介

    对于很多用discuz做资源下载站来说,一个个上传附件,发帖是很繁琐的过程。如果需要批量上传附件发帖,就需要去模拟discuz 上传附件的流程。

    模拟上传

    discuz 附件逻辑

    dz附件储存在一个附件索引表pre_forum_attachment 和一系列分表pre_forum_attachment_0-9 里面,具体是哪个分表工具帖子tid而定。
    参考discuz 内部实现可以精简为:

    $tableid=substr($tid, -1);   //tableid 为附件分表数字 帖子id
    

    附件模拟上传函数

    根据以上分析,封装为一个单独的函数

    /**
    *@desc     添加附件函数,具体操作是模拟discuz正常上传附件功能,返回一个附件id
    *@param    $file  服务器上面的文件路径
    *@param    $tid   帖子id
    *@param    $pid   post_id
    *@param    $dirs  文件夹
    *@param    $attachment_score   积分
    *@return   返回附件id
    **/
    function  add_attachment($file,$tid,$pid,$dirs,$attachment_score){
    
      $file_path=$dirs.'\'.$file;
      //后缀
      $attachment='/'.md5(rand_str()).".attach";
      $new_file_path='./data/attachment/forum'.$attachment;
      $uid=1; //暂时设置为管理员
    
      if(copy($file_path,$new_file_path)){
    
      
        $tableid=substr($tid, -1); // 分表处理逻辑
        
        $attach=array(
        'tid' => $tid ,
        'pid' => $pid,
        'uid' => $uid,
        'tableid' => $tableid,  
        
        );
        
        $aid=DB::insert('forum_attachment',$attach,true);
     
        if($attachment_score==0){
        $attachment_info=array(
    
        'aid'        => $aid,
        'uid'        => $uid,  //发布者id
        'tid'        => $tid,
        'pid'        => $pid,
        'dateline'   => time(),
        'filename'   => $file,  //文件名称
        'filesize'   => filesize($new_file_path),
        'attachment' => $attachment ,
    
        );
          
        }else{
              $attachment_info=array(
    
        'aid'        => $aid,
        'uid'        => $uid,  //发布者id
        'tid'        => $tid,
        'pid'        => $pid,
        'dateline'   => time(),
        'filename'   => $file,  //文件名称
        'filesize'   => filesize($new_file_path),
        'attachment' => $attachment ,
        'price' => $attachment_score ,//附件积分
    
        );      
          
        }  
    
        DB::insert('forum_attachment_'.$tableid,$attachment_info,true);
          return  $aid;
    
      }
    
    }
    

    批量发帖

    实现模拟批量上传附件之后,再来模拟批量发帖。代码参考discuz 内核实现。

        $discuz_uid = 1;  // uid
        $discuz_user = 'admin'; //用户名
        $fid = intval($_POST['fid']); //版块id
        $typeid = 0;
        $subject = substr(strrchr($dirs, '\'),1);   // 帖子标题
        $message = $text_content.$word_content.$imgpng_content.$imgjpg_content;   //
        $timestamp = $_G['timestamp'];
        $onlineip = $_G['clientip'];
        $ismobile = 4; //
       
    
        if($arr_attachment_file==NULL){
          $newthread = array(
          'fid' => $fid,
          'posttableid' => 0,
          'typeid' => $typeid,
          'readperm' => '0',
          'price' => '0',
          'author' => $discuz_user,
          'authorid' => $discuz_uid,
          'subject' => $subject,
          'dateline' => $timestamp,
          'lastpost' => $timestamp,
          'lastposter' => $discuz_user
          );
          $tid = C::t('forum_thread')->insert($newthread, true);
    
          $subject = addslashes($subject);
          $message = addslashes($message);
          $pid = insertpost(array(
          'fid' => $fid,
          'tid' => $tid,
          'first' => '1',
          'author' => $discuz_user,
          'authorid' => $discuz_uid,
          'subject' => $subject,
          'dateline' => $timestamp,
          'message' => $message,
          'useip' => $_G['clientip']
          ));
        }else{
          $newthread = array(
          'fid' => $fid,
          'posttableid' => 0,
          'typeid' => $typeid,
          'readperm' => '0',
          'price' => '0',
          'author' => $discuz_user,
          'authorid' => $discuz_uid,
          'subject' => $subject,
          'dateline' => $timestamp,
          'lastpost' => $timestamp,
          'attachment'=>'1',
          'lastposter' => $discuz_user
          );
          $tid = C::t('forum_thread')->insert($newthread, true);
    
          $subject = addslashes($subject);
          $message = addslashes($message);
          $pid = insertpost(array(
          'fid' => $fid,
          'tid' => $tid,
          'first' => '1',
          'author' => $discuz_user,
          'authorid' => $discuz_uid,
          'subject' => $subject,
          'dateline' => $timestamp,
          'message' => $message,
          'attachment'=>'1',
          'useip' => $_G['clientip']
          ));
          foreach($arr_attachment_file   as   $keyes=> $values ){
            foreach($values as $file){
              //批量添加附件
              add_attachment($file,$tid,$pid,$dirs,$attachment_score);
    
            }
          }
    
    
        }
        DB::query("UPDATE pre_forum_forum SET lastpost='$timestamp', threads=threads+1, posts=posts+1, todayposts=todayposts+1 WHERE fid='$fid'", 'UNBUFFERED');
        DB::query("UPDATE pre_common_member_count SET threads=threads+1 WHERE uid='$discuz_uid'", 'UNBUFFERED');
        DB::query("UPDATE pre_common_member_status SET lastpost='$timestamp' WHERE uid='$discuz_uid'", 'UNBUFFERED');
    

    转自:http://www.blogs8.cn/posts/Eryae77  

      

  • 相关阅读:
    牛客题霸NC15求二叉树的层序遍历Java题解
    牛客题霸NC105二分查找Java题解
    .net基本性本能优化问题
    urlRewriter
    元数据MetaData
    asp.net整体运行机制详解
    asp.net整体运行机制
    asp.net页面从初始化到卸载事件顺序
    Spring表达式语言之SpEL
    Spring 学习笔记(三)之注解
  • 原文地址:https://www.cnblogs.com/esion/p/6219288.html
Copyright © 2011-2022 走看看