技术的世界只说技术就好了..

分类目录

近期文章

标签

近期评论

功能

2018年八月
« 11月    
 12345
6789101112
13141516171819
20212223242526
2728293031  

发布个我自己写的PHP批量上传类..

 

HTML页面部分:

XML/HTML代码
        

  1. <form enctype="multipart/form-data" method="post" name="upform">
  2.     

  3. 上传文件: br><br>
  4.     

  5. 1.<input name="upfile[]" type="file" size="30"><br><br>
  6.     

  7. 2.<input name="upfile[]" type="file" size="30"><br><br>
  8.     

  9. 3.<input name="upfile[]" type="file" size="30"><br><br>
  10.     

  11. 4.<input name="upfile[]" type="file" size="30"><br><br>
  12.     

  13. <input type="submit" value="上传" size="17">
  14.     

  15. </form>

[separator]

核心类

        

  1. class FilesUpload {
  2.     

  3. var $maxsize = 0 ;
  4.     

  5. var $src_fsizes = 0;
  6.     

  7. var $sux = array ('gif', 'jpg', 'png', 'zip', 'rar', 'txt', 'doc', 'pdf');
  8.     

  9. var $dst_path = './upload';
  10.     

  11. var $dst_name = 'randstring().\'.\'.$Files[\'type\'];';
  12.     

  13. var $errver = false;
  14.     

  15. var $errfile = 0;
  16.     

  17. var $errno = 0;
  18.     

  19. var $error = '';
  20.     

  21. var $reinfo = '';
  22.     

  23.  
  24.     

  25. function __construct(){
  26.     

  27. $this->FilesUpload();
  28.     

  29. }
  30.     

  31.  
  32.     

  33. function FilesUpload(){
  34.     

  35. $this->maxsize = (int) ini_get ( 'upload_max_filesize' ) * 1024 * 1024;
  36.     

  37. $this->dst_path = BIGQI_ROOT.$this->dst_path;
  38.     

  39. }
  40.     

  41.  
  42.     

  43. function maxsize($maxsize){
  44.     

  45. $this->maxsize = $maxsize * 1024; //kb
  46.     

  47. }
  48.     

  49.  
  50.     

  51. function send($Uploadfiles){
  52.     

  53. for($i = 0; $i < count ( $Uploadfiles ['name'] ); $i ++) {
  54.     

  55. $upload_name = $Uploadfiles ['name'] [$i];
  56.     

  57. $upload_tmpname = $this->str_fillter ( $Uploadfiles ['tmp_name'] [$i] );
  58.     

  59. $upload_size = $Uploadfiles ['size'] [$i];
  60.     

  61. $upload_mime = $Uploadfiles ['type'] [$i];
  62.     

  63. $upload_type = getfilesux ( $Uploadfiles ['name'] [$i] );
  64.     

  65. if (!$upload_name && !$upload_tmpname && !$upload_size && !$upload_mime && !$upload_type){
  66.     

  67. continue;
  68.     

  69. }
  70.     

  71.  
  72.     

  73. if ($Uploadfiles ['error'] [$i] != 0) {
  74.     

  75. $this->errver = true;
  76.     

  77. $this->errfile = $i;
  78.     

  79. $this->errno = 10;
  80.     

  81. $this->error = $Uploadfiles ['error'] [$i];
  82.     

  83. return false;
  84.     

  85. }
  86.     

  87. if (! in_array ( $upload_type, $this->sux )) {
  88.     

  89. $this->errver = true;
  90.     

  91. $this->errfile = $i;
  92.     

  93. $this->errno = 20;
  94.     

  95. $this->error = 'UploadFile type error!';
  96.     

  97. return false;
  98.     

  99. }
  100.     

  101. if (! is_uploaded_file ( $upload_tmpname )) {
  102.     

  103. $this->errver = true;
  104.     

  105. $this->errfile = $i;
  106.     

  107. $this->errno = 30;
  108.     

  109. $this->error = 'UploadFile tmpname error!';
  110.     

  111. return false;
  112.     

  113. }
  114.     

  115. if (! $upload_size ) {
  116.     

  117. continue;
  118.     

  119. }else{
  120.     

  121. $this->src_fsizes += $upload_size;
  122.     

  123. }
  124.     

  125. $DstFiles [$i] ['name'] = $upload_name;
  126.     

  127. $DstFiles [$i] ['temp'] = $upload_tmpname;
  128.     

  129. $DstFiles [$i] ['size'] = $upload_size;
  130.     

  131. $DstFiles [$i] ['type'] = $upload_type;
  132.     

  133. $DstFiles [$i] ['mime'] = $upload_mime;
  134.     

  135.  
  136.     

  137. }
  138.     

  139.  
  140.     

  141. if ($this->src_fsizes > $this->maxsize) {
  142.     

  143. $this->errver = true;
  144.     

  145. $this->errfile = $i;
  146.     

  147. $this->errno = 40;
  148.     

  149. $this->error = 'UploadFile maxsize too big!';
  150.     

  151. return false;
  152.     

  153. }
  154.     

  155. if (!$this->errver){
  156.     

  157. $savefullpath_array = array();
  158.     

  159. foreach($DstFiles as $key =>$Files){
  160.     

  161. $basename = basename ( $Files['name'], '.'.$Files['type'] );
  162.     

  163. do {
  164.     

  165. eval('$file_savename='.$this->dst_name.';');
  166.     

  167. $file_savefullpath = $this->dst_path . "/" . $file_savename;
  168.     

  169. } while ( file_exists ( $file_savefullpath ) );
  170.     

  171.  
  172.     

  173. if (! move_uploaded_file ( $Files['temp'], $file_savefullpath )) {
  174.     

  175. $this->errver = true;
  176.     

  177. $this->errfile = $i;
  178.     

  179. $this->errno = 50;
  180.     

  181. $this->error = 'UploadFile rename error!';
  182.     

  183. foreach($savefullpath_array as $filesed){
  184.     

  185. delfile($filesed);
  186.     

  187. }
  188.     

  189. unset($savefullpath_array);
  190.     

  191. return false;
  192.     

  193. }else{
  194.     

  195. $DstFiles[$key]['sname'] = $file_savename;
  196.     

  197. $savefullpath_array[] = $file_savefullpath;
  198.     

  199. }
  200.     

  201. }
  202.     

  203. $this->reinfo = $DstFiles;
  204.     

  205. unset($savefullpath_array,$DstFiles,$_FILES);
  206.     

  207. return $DstFiles;
  208.     

  209.  
  210.     

  211. }
  212.     

  213.  
  214.     

  215. }
  216.     

  217.  
  218.     

  219. function str_fillter($string) {
  220.     

  221. $string = str_replace("\\\"", "\"", $string);
  222.     

  223. $string = str_replace("\\'", "'", $string);
  224.     

  225. $string = str_replace("\\\\", "\\", $string);
  226.     

  227. return $string;
  228.     

  229. }
  230.     

  231. }
  232.     

  233. function getfilesux($filename) {
        $stuff = pathinfo ( $filename );
        return $stuff ['extension'];
        }

使用方法:

PHP代码
        

  1. $upload = new FilesUpload();
  2.     

  3. $upload ->dst_path = $uploadpath;
  4.     

  5. $upload -> send($_FILES[upfile]);
  6.     

  7. var_dump ($upload -> reinfo);

 

 

完美的GDI++字体渲染

GDI++是一个开源项目,它能接管Windows系统的GDI字体渲染功能,实现比Mac系统更华丽的字体渲染效果!

使用PC的朋友再也不需要羡慕Mac上清晰的中文字体了,因为GDI++是有过之而无不及的。

GDI++和微软的ClearType其实是相类似的技术,都是24位字体渲染技术,在支持灰阶显示的字体边缘加上阴影,

但GDI++的强大的可定制性和 灵活性足以令ClearType无地自容,GDI++可精细定制到字体的粗细、

色深,阴影的方位、长度,字体代换,排除列表等等相当多的自定义选项.

GDI++的精髓在于它的配置文件的编写,不同的系统环境、显示器类型及使用者的视

觉习惯都需要不同的配置文件来实现最后实际输出效果的最优化。在讲如何 编写配置文件之前,先来看几张截图:
注:不同的显示器显示效果可能有所不同,效果上可能有所折扣。

这是Gmail首页的截图:

我的电脑截图:

文本文件截图:

[separator]

怎么样?这些截图上的字体漂亮吧?想不想自己的电脑也能和上面一样呢?想就跟我来吧!!
----------------------------- 我是勤劳的分割线,以下为正文 ----------------------------------

题记:使用GDI++的前提是你使用的是支持灰阶渲染的字体,除了系统自带的几个中文字体不支持灰阶之外,现在较为流行的方正、华文、华康和汉仪等等中文字体都支持灰阶渲染。不要用着宋体却问我为什么效果没变!下文如无特别说明所指均为老版(Freetype版)的GDI++,并非新的“氦”版。

GDI++的安装这里就不多讲了,下载文末附件里的自动安装版双击就自动安装好并设为开机自动加载了。GDI++的安装唯一要注意的一点是要尽量安装在靠 近系统核心的地方,即靠近system32文件夹的地方(附件中的自动安装版安装在windows\system32\GDI++目录下,以下内容也以此 文件夹为例。),虽然官方的文档并没有特别说明这一点,但根据网友使用的反馈来看安装在靠近核心的地方会相对较为稳定,不知道是什么原因。

GDI++的加载方式共有三种:第一种是手动将要渲染的程序拖到GDI++安装文件夹中的gdi++.exe上,这样这个程序的字体就被GDI++所渲染 了。第二种方法是先创建一个gditray.exe的快捷方式,然后把快捷方式中的目标部分改为C:\WINDOWS\system32\gdi++\gditray.exe "-on",即在原来目标的后面加个空格,然后是"-on"就可以了,把这个快捷方式放到开始菜单的启动文件夹里,这样开机的时候GDI++就会自动开始 渲染了。最后一种方法是注册表加载法,也是我最推崇的方法,将以下内容写入记事本:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows]
"AppInit_DLLs"="C:\\WINDOWS\\system32\\GDI++\\gdi++.dll"

并保存为GDI++.reg,双击导入即可。第一种是为临时想用用试试的人准备的,无法渲染系统字体。第二种是全局加载,即整个系统都会被 渲染,而且系统托盘中有图标,可以轻易地停用或者启用GDI++,随意地切换多个配置文件或者重新渲染。但由于启动文件夹的优先级较低,所以往往要到进入 桌面后才启动,桌面字体会经历一次由难看到清晰的转变,当然,在这之前弹出的所有对话框也不会被渲染。那为什么要推崇用注册表加载呢?注册表法也是属于全 局加载,但他的优先级极高,WindowsXP的“欢迎使用”界面还没出现它就已经加载了,而且稳定性相当好,当你配置文件已定,要准备进入长期使用的时 候这种方法是首选。不过缺点是这个键值也较为容易被病毒木马所利用,所以大部分杀毒软件都会对这个键值有监控,甚至没有任何提示直接阻止,像瑞星2008 那个LJ。而且更换配置文件或者修改配置后像查看效果较为不便,需要重启想查看效果的软件。

接下来讲GDI++配置文件的编写,这是我当前所用的Freetype版的配置文件:

[General]
;配置文件名
Name=fonlan

; 自动挂钩子进程
; [0:Disable] 1:Enable

HookChildProcesses=1

; 字体微调
;情况一,当FontLoader=0(在下面)时:
;0:使用字体内部的微调,字体内部没有微调的话就和选1时的效果一样;
;1:不使用微调;
;2:用freetype对字体进行微调。
;(注:1.下面的选了4或5的时候,就算是某个没有内部微调的字体,在此项设定为0时也还是会被应用微调;2.有内部微调的英文字体在下面的AntiAliasMode选择4或5时,推荐将此项设为0。)
;情况二,当FontLoader=1(在下面)时:0和2完全一样,其他同情况一。

HintingMode=2

; 抗锯齿方式,将此值设的过大的时候可能反而会变得五彩、看起来更费劲,GammaCorrection=1时无效。
; -1:Disable [0:Normal] 1:Light 2:LCD(RGB) 3:LCD(GBR) 4:Light-LCD(RGB) 5:Light-LCD(GBR)

AntiAliasMode=4

; 交付 gdi++ 处理的最大尺寸(单位为像素)
; 可调范围0~2147483647,0表示全尺寸

MaxHeight=300

;只有在FontLoader=0(在下面)时此项设置才有效。建议选0。
UseMapping=0

;字体链接
; 0:Disable 1:Enable
;当FontLoader=0(在下面)时:
;0:什么都不做;
;1:使用注册表里的字体链接设置;
;当FontLoader=1(在下面)时:
;会保持启用的状态,但是所有字体链接的处理会交由WIN32API完成。

FontLink=1

;字体替代
; 0:Disable 1:ini Only 2:ini+Registry
;当FontLoader=0(在下面)时:
;0:什么都不做;
;1:使用该设置文件最下面的设置;
;2:该设置文件最下面的设置和注册表里的设置一起启用。
;当FontLoader=1(在下面)时:
;会保持启用的状态,但是所有字体替代的处理会交由WIN32API完成

FontSubstitutes=2

;字宽设置
; 0:GDI32 1:FreeType

WidthMode=0

;字体载入方法
; 0:FreeType 1:WIN32

FontLoader=1

;粗体字的渲染方法(只对没有单独粗体字文件的字体有效)
; 0:New 1:Old 2:Original FreeType Algorithm

BolderMode=0

;Gamma模式开关
; -1 = Disabled 0 = Use "GammaValue" 1 = sRGB 2 = Aternative

GammaMode=0

;Gamma值(只有上面GammaMode=0的时候此项设置才有效。精确到小数点后一位。)
GammaValue=1.4

;字体轮廓
;数字越大字体就越粗越黑(当字体为黑色时,其他颜色时表现出来的是颜色越深)。精确到小数点后两位。

RenderWeight=1.5

;对比度
;数字越大越锐利,数字越小越发虚。精确到小数点后一位。

Contrast=1.5

;RGB三色全局设置
; 取值范围0~12,-1时无效

TextTuning=0
TextTuningR=-1
TextTuningG=-1
TextTuningB=-1

;字体粗细的单独调整,数字越大越粗,负数也有效,可以使字体更细。
NormalWeight=0
BoldWeight=4

;取值范围-16~+16
;字形为斜体时的倾斜加角
;可以设置字形为斜体时的倾斜加角。正数为右倾,负数为左倾。数字越大加角幅度越大。
;此项设置仅对没有单独斜体字形的字体有效。

ItalicSlant=0

;液晶显示器的优化配置
;0:None 1:Default 2:Light 16:Legacy

LcdFilter=2

;阴影设置
Shadow=1,1,6

;字体缓存、内存的设置
LoadOnDemand=1
CacheMaxFaces=32
CacheMaxSizes=32
CacheMaxBytes=10485760

;强制使用以下字体为系统界面字体
#ForceChangeFont=SIMSUN

[Individual]
;顺序格式=Hinting,AAMode,NormalWeight,BoldWeight,ItalicSlant,Kerning
Tahoma=1
MingLiU=1
PMingLiU=1
微软雅黑 = 3
Lucida Grande = 1
MS Shell Dlg = 1
MS Shell Dlg 2 = 1

[Exclude]
;不渲染的字体列表
FIXEDSYS
Marlett

[ExcludeModule]
;排除的程序列表(gdi++.dll依然会注入以下进程,但不会生效)
imejpmgr.exe
msdev.exe
devenv.exe
winlogon.exe
fontview.exe
SREngPS.EXE
cstrike.exe
xdict.exe
CppIDE.exe
nvsvc32.exe
services.exe
csrss.exe
lsass.exe
svchost.exe
wmiprvse.exe
Safari.exe
spoolsv.exe
ctfmon.exe
scardsvr.exe
conime.exe
SynTPEnh.exe
RTHDCPL.exe
smss.exe
agrsmsvc.exe
oobechk.exe
jqs.exe

[FontSubstitutes]
;字体替换
Microsoft Sans Serif=SimSun
System=SimSun

以上配置文件中的注释参考了70599大侠的大作,对70599大侠除了膜拜我想不出第二个词语。Orz

在实际的调校过程中主要就是GammaValueRenderWeightContrastShadow这四个参数最为重要,他直接决定了Freetype版GDI++在你的电脑上的表现,而我们的微调也主要是调这几个参数。

我使用的是字体是先锋论坛的一位网友修改的方正准圆_GBK,网页字体是蚂蚁老版的iYuanTi,效果图如文首的那几幅截图。
---------------------------------------很重要的,不得不看---------------------------------------

下面我来说说使用GDI++过程中的一些需要注意的地方:GDI++,尤其是Freetype版,虽然字体渲染效果较为出色,但兼容性较差,和很多软件都有兼容性问题。首 先和IE的兼容性问题就不小,使用IE内核的浏览器时,遨游和遨游2开启后进入选项没多久就程序崩溃,世界之窗可以正常运行,但主界面菜单字体会变得比较 大(这点其实可以通过把配置文件中的FontLink值改为0来修正),但可以在设置中制定主界面所用字体及字 号。Firefox和Opera与GDI++完全兼容。所以在GDI++环境下浏览器最好选择非IE内核的,如果一 定要使用IE内核建议使用世界之窗2.0。

GDI++和魔兽世界的小地图有冲突,因为魔兽的字体也使用了同样的字体渲染方式。解决方法是使用gditray加载方式,在启动魔兽世界之前关闭GDI++渲染即可。

还有一个比较严重的问题是QQ比较容易崩溃,操作的时候一不小心QQ可能就崩溃了,解决的方法要么把QQ加入GDI++的排除列表,要么把 FontLoad改为1,但全局渲染效果会变差,要么就小心使用,忍受这颗不定时的炸弹,但最彻底的解决方案还是使用氦版的GDI++,QQ不会出现崩溃的情况。

GDI++对迅雷的支持也有限,虽然不会造成迅雷的崩溃,但迅雷一旦开始下载,GDI++便无法渲染迅雷的界面了,不知是什么原因。

GDI++工作的方式是注入到所有正在运行的进程下,拦截所有原本由系统的gdi32完成的字体渲染工作。这两个行为都是极有可能被杀毒软件所误报的,所 以请务必把gdi++添加到杀毒软件的可信任程序列表,否则他是无法工作的。还有通过注册表全局加载的时候,由于使用的是 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows项下的AppInit_DLLs来实现开机自动加载,但由于这个键也是病毒木马常用的启动项,所以几 乎所有的安全软件都会对这个键有所监控,请在安装前先关闭安全软件,否则可能出现无法导入注册表的情况。

GDI++的配置文件有两种放法:一种是把配置文件直接保存成gdi++.ini,放在GDI++的安装目录下,优点是目录结构简单、清晰,建议使用注册 表全局渲染时使用。缺点是只能使用一种配置文件,使用Gditray加载时无法在右键中切换配置。另一种方法是在GDI++的安装文件夹中新建一个名为 ini的文件夹,将所有的配置文件放在此文件夹下,然后GDI++安装文件夹下的gdi++.ini按如下格式编写:

[General]
AlternativeFile=.\ini\蓝枫冰月.ini

[GdiTray]
MultiINISelector=1
RedrawDelay=50
CoolMenu=1

这里的蓝枫冰月.ini就是你放在ini文件夹中并且希望当前启用的配置文件。使用这个方法时不论使用何种全局加载方式,gdi++都会在开机时根据gdi++.ini文件中AlternativeFile后 面的路径来寻找配置文件并加载,注意:这个路径是允许使用相对路径的。这种方法的优点也是显而易见,使用gditray加载时可以在邮件里轻松的切换多个 配置文件,使用注册表加载时也只要修改gdi++.ini中的配置文件名(即上例中的蓝枫冰月.ini),然后注销即可切换配置。缺点就是多一个叫ini 的文件夹,或许这个也算不上是缺点。

替换宋体的下载请看这里:http://fonlan.cn/post/20.html
氦版GDI++补充教程: http://fonlan.cn/post/11.html
GDI++使用 FAQ:http://fonlan.cn/post/18.html

Freetype版GDI++下载:
纳米盘下载:

BRSBOX下载:

© 2018 技术控 All Rights Reserved