Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

uchome swfupload 相册上传分析.

[复制链接]
元首 发表于 2009-12-29 11:10:00 | 显示全部楼层 |阅读模式
首先, uchome的相册功能,为整个home增加了不少人气.多图片上传,更使得操作者方便分享自己的图片.
  为什么说是浅级应用呢, 首先, 这上传与discuz来比, 还相差太远. 功能也欠缺.
  除了部分内置的url引向,我们改不了之外, 其它的数据都是可以修改的.
  1. <?php
  2. /*
  3.         [UCenter Home] (C) 2007-2008 Comsenz Inc.
  4.         $Id: do_swfupload.php 12830 2009-07-22 06:42:32Z zhengqingpeng $
  5. */

  6. if(!defined('IN_UCHOME')) {  //入门牌.
  7.         exit('Access Denied');
  8. }

  9. include_once(S_ROOT.'./source/function_cp.php');

  10. $op = empty($_GET['op'])?'':$_GET['op'];  // uchome比较喜欢用的方法变量.
  11. $isupload = empty($_GET['cam']) && empty($_GET['doodle']) ? true : false;  //是否上传.还有种可能是头像上传.
  12. $iscamera = isset($_GET['cam']) ? true : false;  //判断一下是头像上传.
  13. $isdoodle = isset($_GET['doodle']) ? true : false;  //判断一下是大头贴背景是否随机.
  14. $fileurl = ''; // 默认赋值.
  15. if(!empty($_POST['uid'])) {  //如果有uid传过来, 表示在上传头像, 就取得uid值.
  16.         $_SGLOBAL['supe_uid'] = intval($_POST['uid']);    //强制转化.
  17.         if(empty($_SGLOBAL['supe_uid']) || $_POST['hash'] != md5($_SGLOBAL['supe_uid'].UC_KEY)) {  // 既然传递了uid值是过来, 假如用户没有登录,及hash码不对应,就中断.
  18.                 exit();
  19.         }
  20. } elseif (empty($_SGLOBAL['supe_uid'])) {  //否则再判断, 如果没有登录, 禁止使用上传功能.
  21.         showmessage('to_login', 'do.php?ac='.$_SCONFIG['login_action']);
  22. }

  23. if($op == "finish") {  //上传结束时.
  24.         /* 它会传入如下GET
  25.         array (
  26.                   'ac' => 'swfupload',
  27.                   'op' => 'finish',
  28.                   'albumid' => '2',
  29.    )*/
  30.         $albumid = intval($_GET['albumid']);  //取得分类id.
  31.         $space = getspace($_SGLOBAL['supe_uid']); //更新用户部分记录, 比较图片总数, 容量计算.
  32.         if(ckprivacy('upload', 1)) {  //判断一下是否已经写了推送.
  33.                 include_once(S_ROOT.'./source/function_feed.php');
  34.                 feed_publish($albumid, 'albumid');  //否则就再写一次.
  35.         }
  36.         //强行中断.
  37.         exit();
  38. } elseif($op == 'config') {  //swf上传的配置.
  39.         /* 根据抓取所得 GET传过来:
  40.          array (
  41.                   'ac' => 'swfupload',
  42.                   'op' => 'config',
  43.         )
  44.         */
  45.         $hash = md5($_SGLOBAL['supe_uid'].UC_KEY); //生成一个hash码.
  46.        
  47.         if($isupload && !checkperm('allowupload')) {  //是上传图片,并且权限足够.对于配置来说, $isupload永远为假.
  48.                 $hash = '';
  49.         } else {
  50.                 $filearr = $dirstr = array();  //初始化数组.  文件数组/及目录数据.
  51.                 //&#65533;&#65533;&#887;&#65533;&#65533;&#892;
  52.                 if($iscamera) {  //进入头像上传工作.
  53.                         /*
  54.                                 根据抓取, GET数据如下:
  55.                                 array (
  56.                                   'ac' => 'swfupload',
  57.                                   'op' => 'config',
  58.                                   'cam' => '1',
  59.                                 )
  60.                         */
  61.                         $directory = sreaddir(S_ROOT.'./image/foreground'); //大头贴背景的目录. sreaddir读取里面的目录数据.
  62.                         foreach($directory as $key => $value) {   //每一个背景都是独立的一个目录, 所以循环一下.
  63.                                 $dirstr = S_ROOT.'./image/foreground/'.$value;  //合成新的路径.
  64.                                 if(is_dir($dirstr)) { //判断一下是否是目录.
  65.                                         $filearr = sreaddir($dirstr, array('jpg','jpeg','gif','png')); //读取目录里面的图片文件.
  66.                                         if(!empty($filearr)) {   // 如果图片数组不为空.
  67.                                                 if(is_file($dirstr.'/categories.txt')) {  // 如果categories.txt文件存在.
  68.                                                         $catfile = @file($dirstr.'/categories.txt');   //打开此文件.
  69.                                                         $dirarr[$key][0] = trim($catfile[0]);  //就将里面的文件读取来. 当然, 很无谓的方法, 里面的内容与目录名是一样的.
  70.                                                 } else {   //如果txt文件不存在, 就取得目录名.
  71.                                                         $dirarr[$key][0] = trim($value);  //准确取得值, trim多用.
  72.                                                 }
  73.                                                 $dirarr[$key][1] = trim('image/foreground/'.$value.'/');  //将指针1设置为当前大头贴背景目录.
  74.                                                 $dirarr[$key][2] = $filearr;  // //将指针2设置为当前大头贴背景目录里面的图片.
  75.                                         }
  76.                                 }
  77.                         }
  78.                 } elseif($isdoodle) { //如果是头像随机背景, 就读取./image/doodle/big里面的图片文件.
  79.                         $filearr = sreaddir(S_ROOT.'./image/doodle/big', array('jpg','jpeg','gif','png'));
  80.                 }
  81.         }
  82.         //接着就到了图片上传配置工作.
  83.         $max = @ini_get(upload_max_filesize); //取得php.ini最大上传值.
  84.         $unit = strtolower(substr($max, -1, 1));  //$max结尾有kb字样吧, 要截取一下,并且转成小写.
  85.        
  86.         //下面是针对不同的计算单元作换算.
  87.         if($unit == 'k') {
  88.                 $max = intval($max)*1024;   //看样子是全部转成byt字节单位. KB X 1024 = 多少字节.
  89.         } elseif($unit == 'm') {
  90.                 $max = intval($max)*1024*1024; // MB X 1024 X 1024 = 多少字节.
  91.         } elseif($unit == 'g') {
  92.                 $max = intval($max)*1024*1024*1024;  // GB X 1024 X 1024 X 1024 = 多少字节.
  93.         }
  94.         //取得用户所建立的分类数组.
  95.         $albums = getalbums($_SGLOBAL['supe_uid']);
  96.        
  97. } elseif($op == "screen" || $op == "doodle") {  // screen 不理解什么时候出来 || 随机大头贴背景,由于没有摄像头, 这里面略过.
  98.        
  99.         if(empty($GLOBALS['HTTP_RAW_POST_DATA'])) {  
  100.                 $GLOBALS['HTTP_RAW_POST_DATA'] = file_get_contents("php://input");
  101.         }
  102.         $status = "failure";
  103.         $dosave = true;
  104.        
  105.         if($op == "doodle") {  
  106.                 $query = $_SGLOBAL['db']->query('SELECT * FROM '.tname('usermagic')." WHERE uid = '$_SGLOBAL[supe_uid]' AND mid = 'doodle'");
  107.                 $value = $_SGLOBAL['db']->fetch_array($query);
  108.                 if(empty($value) || $value['count'] < 1) {//&ucirc;&#65533;&#65533;&#895;&#1147;&#65533;&#65533;
  109.                         $uploadfiles = -8;
  110.                         $dosave = false;
  111.                 }
  112.         }
  113.        
  114.         //&#65533;&#65533;&#65533;&#938;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#889;&#65533;4&#65533;&#65533;&#65533;&#65533;&#65533;д&#65533;&#65533;&#65533;
  115.         if($dosave && !empty($GLOBALS['HTTP_RAW_POST_DATA'])) {
  116.                 $_SERVER['HTTP_ALBUMID'] = addslashes(siconv(urldecode($_SERVER['HTTP_ALBUMID']), $_SC['charset'], "UTF-8"));
  117.                 $from = false;
  118.                 if($op == 'screen') {
  119.                         $from = 'camera';
  120.                 } elseif($_GET['from'] == 'album') {
  121.                         $from = 'uploadimage';
  122.                 }
  123.                 $_SCONFIG['allowwatermark'] = 0;        //&#65533;&#65533;&#1465;&#65533;&#65533;&#65533;&#750;&#1249;
  124.                 $uploadfiles = stream_save($GLOBALS['HTTP_RAW_POST_DATA'], $_SERVER['HTTP_ALBUMID'], 'jpg', '', '', 0, $from);
  125.         }
  126.        
  127.         $uploadResponse = true;
  128.         $picid = $proid = $albumid = 0;
  129.         if($uploadfiles && is_array($uploadfiles)) {
  130.                 $status = "success";
  131.                 $albumid = $uploadfiles['albumid'];
  132.                 $picid =  $uploadfiles['picid'];                       
  133.                 if($op == "doodle") {                       
  134.                         $fileurl = pic_get($uploadfiles['filepath'], $uploadfiles['thumb'], $uploadfiles['remote'], 0);
  135.                         include_once(S_ROOT.'./source/function_magic.php');
  136.                         magic_use('doodle', array(), 1);
  137.                 }
  138.         } else {
  139.                 switch ($uploadfiles) {
  140.                         case -1:
  141.                                 $uploadfiles = cplang('inadequate_capacity_space');
  142.                                 break;
  143.                         case -2:
  144.                                 $uploadfiles = cplang('only_allows_upload_file_types');
  145.                                 break;
  146.                         case -4:
  147.                                 $uploadfiles = cplang('ftp_upload_file_size');
  148.                                 break;
  149.                         case -8:
  150.                                 $uploadfiles = cplang('has_not_more_doodle');
  151.                                 break;
  152.                         default:
  153.                                 $uploadfiles = cplang('mobile_picture_temporary_failure');
  154.                                 break;
  155.                 }
  156.         }

  157. } elseif($_FILES && $_POST) {   // 图片上传时,
  158.         /* 根据抓取, POST GET数据值为:
  159.         POST = array (
  160.                   'Filename' => 'MJP45+R3001.jpg',
  161.                   'proid' => '1',
  162.                   'albumid' => '2',
  163.                   'uid' => '1',
  164.                   'title' => 'MJP45+R3001',
  165.                   'hash' => '11ed07fe235ca5b9e509043e85419785',
  166.                   'Upload' => 'Submit Query',
  167.         )
  168.        
  169.         GET = array (
  170.           'ac' => 'swfupload',
  171.         )
  172.        
  173.         */
  174.         if($_FILES["Filedata"]['error']) { //如果有上传错误
  175.                 $uploadfiles = cplang('file_is_too_big'); // 就提示文件过大.
  176.         } else {
  177.                 //考虑到编码及大小写问题, 还有转义. 取得上传文件名.
  178.                 $_FILES["Filedata"]['name'] = addslashes(siconv(urldecode($_FILES["Filedata"]['name']), $_SC['charset'], "UTF-8"));
  179.                 //考虑到编码及大小写问题, 还有转义. 取得上传分类id.
  180.                 $_POST['albumid'] = addslashes(siconv(urldecode($_POST['albumid']), $_SC['charset'], "UTF-8"));
  181.                 //考虑到编码及大小写问题, 还有转义. 取得上传文件后的一个详解路径.
  182.                 $uploadfiles = pic_save($_FILES["Filedata"], $_POST['albumid'], addslashes(siconv(urldecode($_POST['title']), $_SC['charset'], "UTF-8")));
  183.         }
  184.        
  185.         //根据我的分析, 以下内容在图片上传时没用, 不知头像上传会否用到.
  186.         $proid = $_POST['proid'];
  187.         $uploadResponse = true;
  188.         $albumid = 0;
  189.         //判断一下上传文件, 及上传文件数组.
  190.         if($uploadfiles && is_array($uploadfiles)) {
  191.                 $status = "success";  //上传完成
  192.                 $albumid = $uploadfiles['albumid'];  // 上传的分类id
  193.         } else {
  194.                 $status = "failure"; //这就是上传失败了.
  195.         }
  196.        
  197.         //这是我自己加上去的, 估计uchome也会感激我.
  198.         exit();
  199. }
  200. // 时间
  201. $newalbumname = sgmdate('Ymd');

  202. //引入模板
  203. include template("do_swfupload");

  204. //输出xml, swf配置需要.
  205. $outxml = "<?xml version="1.0" encoding="UTF-8"?>\n";
  206. $outxml .= siconv(ob_get_contents(), 'UTF-8');
  207. obclean();
  208. @header("Expires: -1");
  209. @header("Cache-Control: no-store, private, post-check=0, pre-check=0, max-age=0", FALSE);
  210. @header("Pragma: no-cache");
  211. @header("Content-type: application/xml; charset=utf-8");
  212. echo $outxml;

  213. // 配置文件具体导出什么内容呢? 请访问这个网址.
  214. //http://u.discuz.net/home/do.php?ac=swfupload&op=config
  215. ?>
复制代码
dsnake 发表于 2009-12-30 15:55:18 | 显示全部楼层
   有时间还是来官方看看
回复

使用道具 举报

maya1124 发表于 2010-1-14 20:53:23 | 显示全部楼层
vcxcx                cx xc xc cx xc
回复

使用道具 举报

苓威德 发表于 2010-1-30 10:22:48 | 显示全部楼层
支持下楼主!
谢谢分享。。















热血超辅 热血超辅 热血超辅
热血特辅 热血智辅 热血超辅
回复

使用道具 举报

weixing3 发表于 2010-4-10 17:27:52 | 显示全部楼层
你好  可以像开心网那样  直接把相册里的某张图片  放到那个camera.swf里来编辑头像吗
回复

使用道具 举报

troy2010 发表于 2010-10-29 13:18:17 | 显示全部楼层
en  挺好 支持下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-12-24 01:52 , Processed in 0.031116 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表