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. Java 中使用javah编译头文件出现找不到类的情况

    在工程的bin目录下,输入命令: javah -classpath . -jni 类路径.JNI类

  2. 1.6 基础知识——GP2.5 培训(Training)

    摘要: 实际上做任何项目总会缺失各种技能,培训特别是未雨绸缪的培训就显得很必要了! 正文: GP2.5 Traing the people performing or supporting XXX p ...

  3. Educational Codeforces Round 15 [111110]

    注意一个词:连续 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<bits/ ...

  4. Android动画的实现原理 .

    1.动画运行模式 独行模式 中断模式 2.Animation类 每个动画都重载了父类的applyTransformation方法这个方法的主要作用是把一些属性组装成一个Transformation类, ...

  5. UI里的UIActionSheet按钮

    1.效果图:分别为有短信分享                                      无短信分享 -(void)viewDidLoad{ //添加按钮 UIButton *share ...

  6. 全面了解 Linux 服务器 - 3. 查看 Linux 服务器的硬盘使用情况

    1)查看硬盘及分区信息 liuqian@ubuntu:~# fdisk -l ...... ...... Disk /dev/sda: 100 GiB, 107374182400 bytes, 209 ...

  7. TortoiseSVN-1.8.11 安装时弹出2503错误导致安装失败解决办法

    这个问题主要是由于msi格式文件在win8中默认不是以管理员身份运行造成,可通过命令行解决: 右键单击win8左下角启动图标,选择命令提示符(管理员): 输入:msiexec /package 要安装 ...

  8. nginx根据IP限制访问

    nginx有两个模块可以控制访问 HttpLimitZoneModule    限制同时并发访问的数量 HttpLimitReqModule     限制访问数据,每秒内最多几个请求 http{ ## ...

  9. SqlSever基础 cast 将getdate返回的时间转换成字符串

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  10. HDU 4493 Tutor(精度处理)

    题目 #include<stdio.h> int main() { int t; double a,s; scanf("%d",&t); while(t--) ...