discuz 模拟批量上传附件发帖

简介

对于很多用discuz做资源下载站来说,一个个上传附件,发帖是很繁琐的过程。如果需要批量上传附件发帖,就需要去模拟discuz 上传附件的流程。
插件地址 http://addon.discuz.com/?@uauc_auto_thread.plugin

模拟上传

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');

演示

茫茫多的文件夹

帖子列表

[auto_thread.png]

批量上传附件之后的帖子

[auto-post-2.png]

discuz 模拟批量上传附件发帖的更多相关文章

  1. Discuz模拟批量上传附件发帖

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

  2. Discuz! X论坛上传附件到100%自动取消上传的原因及解决方案

    最近接到一些站长的反馈,说论坛上传附件,到100%的时候自己取消上传了.经查是附件索引表pre_forum_attachment表的aid字段自增值出现了问题,导致程序逻辑返回的aid值实际为一个My ...

  3. 使用jQuery Uploadify在ASP.NET 上传附件

    Uploadify是JQuery的一个上传插件,实现的效果非常不错,带进度显示.Uploadify官方网址:http://www.uploadify.com/,在MVC中使用的方法可以参考 jQuer ...

  4. VB.NET上传附件代码

    '附件添加 按钮 点击事件 吴翰哲 2013年7月23日 16:53:19 Protected Sub BtnAddFile_Click(ByVal sender As Object, ByVal e ...

  5. ux.plup.File plupload 集成 ux.plup.FileLis 批量上传预览

    //plupload 集成 Ext.define('ux.plup.File', { extend: 'Ext.form.field.Text', xtype: 'plupFile', alias: ...

  6. OneThink实现多图片批量上传功能

    OneThink原生系统中的图片上传功能是uploadify.swf插件进行上传的,默认是只能上传一张图片的,但是uploadify.swf是支持多图片批量上传的,那么我们稍加改动就可实现OneThi ...

  7. asp.net+swfupload 多图片批量上传(附源码下载)

    asp.net的文件上传都是单个文件上传方式,无法执行一次性多张图片批量上传操作,要实现多图片批量上传需要借助于flash,通过flash选取多个图片(文件),然后再通过后端服务进行上传操作. 本次教 ...

  8. Springmvc+uploadify实现文件带进度条批量上传

    网上看了很多关于文件上传的帖子,众口不一,感觉有点乱,最近正好公司的项目里用到JQuery的uploadify控件做文件上传,所以整理下头绪,搞篇文档出来,供亲们分享. Uploadify控件的主要优 ...

  9. 不带插件 ,自己写js,实现批量上传文件及进度显示

    今天接受项目中要完成文件批量上传文件而且还要显示上传进度,一开始觉得这个应该不是很麻烦,当我在做的时候遇到了很多问题,很头疼啊. 不过看了别人写的代码,自己也测试过,发现网上好多都存在一些问题,并不是 ...

随机推荐

  1. css毛玻璃效果

    毛玻璃其实就是磨砂玻璃,能够模糊的看清背后的风景,让人感觉有种朦胧美,让界面看上去有些层次感. 比如: 高大上啊,接下来肯定是眼馋手痒的过程... 当然,用ps搞一个全景毛玻璃背景毫无疑问是最省事的, ...

  2. 浏览器对于常见HTTP状态码的反应

    在我们向服务器发送一个HTTP请求时,会经历tcp连接(三次握手),发送HTTP请求,服务器返回HTTP响应,浏览器对响应中的状态码进行分析判断,来确定请求是否成功,是否成功得到我们需要的信息. 那么 ...

  3. WebForm——IIS服务器、开发方式和简单基础

    一.B/S和C/S 1.C/S C/S 架构是一种典型的两层架构,其全程是Client/Server,即客户端服务器端架构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两种,一种是数据 ...

  4. 生成Apk遇到的问题

    conversion to dalvik format failed with error 1 android proguard keep Parameterized class

  5. CI控制器的继承问题

    在项目中经常用到这样一种情况,后台中每个页面都要判断Session来确定用户是否登陆状态.对于在Codeigniter中,那么就会考虑每个控制器继承一个公用控制器. 比如:AdminBase 为应用后 ...

  6. GoldenGate中使用FILTER,COMPUTE 和SQLEXEC命令

    本文主要介绍OGG中一些过滤或计算函数的用法,以及sqlexec的基本用法 SQLPREDICATE 在使用OGG初始化时,可以添加此参数到extract中,用于选择符合条件的记录,下面是OGG官方文 ...

  7. Java 序列化的高级认识

    序列化 ID 问题 情境:两个客户端 A 和 B 试图通过网络传递对象数据,A 端将对象 C 序列化为二进制数据再传给 B,B 反序列化得到 C. 问题:C 对象的全类路径假设为 com.inout. ...

  8. WCF寄宿方式

    WCF开发框架形成之旅---WCF的几种寄宿方式 WCF寄宿方式是一种非常灵活的操作,可以在IIS服务.Windows服务.Winform程序.控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者 ...

  9. esriFeatureType与esriGeometryType的区别与联系

    esriFeatureType通常用来表示数据的存储结构,即物理层: esriGeometryType通常用来表示数据的几何形状,即表现层. esriGeometryType枚举类型详解 常量 值 对 ...

  10. POJ 2031 Building a Space Station (最小生成树)

    Building a Space Station 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/C Description Yo ...