Upload.class.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <?php
  2. namespace KIF;
  3. /**
  4. * @name 单文件上传类
  5. * @desc 本控件主要对文件上传过程的监控,需要时可自动创建目标目录的上层目录。文件保存的路径和命名规则不在控件内设置。
  6. * @author lishuming@kimiss.com
  7. * 使用方法
  8. * $objUpload = new \KIF\Upload($custom_config);
  9. * $objUpload->execute();
  10. *
  11. * @param array 自定义配置参数
  12. * $custom_config = array(
  13. * 'save_path' => '/tmp/dir/', (必填)文件保存路径
  14. * 'save_filename' => 'name', (选填)保存文件名。不需要添加文件后缀。留空时使用原名
  15. * 'file_type' => '', (必填)上传文件类型
  16. * 'field' => 'myFile', (必填)客户端文件上传控件名,input 中的表单名
  17. * ...
  18. * );
  19. */
  20. use KIF\Data\ResultWrapper;
  21. class Upload {
  22. /**
  23. * 上传文件控件配置
  24. * @var array
  25. */
  26. private $config = array();
  27. /**
  28. * 上传文件控件默认配置
  29. * @var array
  30. */
  31. private $default_config = array(
  32. 'save_path' => '', //文件保存目录路径。格式:/tmp/dir/
  33. 'save_filename' => null, //保存文件名。默认为空时使用原名
  34. 'file_type' => '', //上传文件的类型。可选项有:image,flash,media,file
  35. 'allow_ext_arr' => array( //定义允许上传文件的扩展名
  36. 'image' => array('gif', 'jpg', 'jpeg', 'png', 'bmp'),
  37. 'flash' => array('swf', 'flv'),
  38. 'media' => array('swf', 'flv', 'mp3', 'wav', 'wma', 'wmv', 'mid', 'avi', 'mpg', 'asf', 'rm', 'rmvb'),
  39. 'file' => array('doc', 'docx', 'xls', 'xlsx', 'ppt', 'htm', 'html', 'txt', 'zip', 'rar', 'gz', 'bz2'),
  40. ),
  41. 'max_size' => 1000000, //允许上传最大文件的大小 (单位字节)
  42. 'field' => '', //客户端文件上传控件名,input 中的表单名
  43. 'dchmod' => 0777, //新创建的目录权限设置
  44. 'fchmod' => 0777, //新创建的文件权限设置
  45. );
  46. public function __construct(/*自定义配置*/$custom_config = array()) {
  47. if (!empty($custom_config)) {
  48. $this->config = array_merge($this->default_config, $custom_config);
  49. } else {
  50. $this->config = $this->default_config;
  51. }
  52. }
  53. public function execute() {
  54. if (!$this->config['save_path']) {
  55. return ResultWrapper::fail('请设置文件保存路径。');
  56. }
  57. $save_path = rtrim($this->config['save_path'], DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
  58. if (!$this->config['file_type']) {
  59. return ResultWrapper::fail('请设置上传文件类型。');
  60. }
  61. $file_type = $this->config['file_type'];
  62. if (!$this->config['field']) {
  63. return ResultWrapper::fail('请设置客户端文件上传控件名。');
  64. }
  65. $field = $this->config['field'];
  66. $ext_arr = $this->config['allow_ext_arr'];
  67. $max_size = $this->config['max_size'];
  68. if (empty($_FILES)) {
  69. return ResultWrapper::fail('没有需要上传的文件。');
  70. }
  71. #保存文件名
  72. if (!$this->config['save_filename']) {
  73. $save_filename = $_FILES[$field]['name'];
  74. }
  75. $save_filename = $this->config['save_filename'];
  76. #原文件名
  77. $file_name = $_FILES[$field]['name'];
  78. #检查文件名
  79. if (!$file_name) {
  80. return ResultWrapper::fail('请选择上传文件。');
  81. }
  82. #服务器上临时文件名
  83. $tmp_name = $_FILES[$field]['tmp_name'];
  84. #文件大小
  85. $file_size = $_FILES[$field]['size'];
  86. #检查是否已上传
  87. if (@is_uploaded_file($tmp_name) === false) {
  88. return ResultWrapper::fail("临时文件可能不是上传文件。");
  89. }
  90. #检查文件大小
  91. if ($file_size > $max_size) {
  92. return ResultWrapper::fail("上传文件大小超过限制。");
  93. }
  94. #获得文件扩展名
  95. $file_ext = $this->getExtension($file_name);
  96. #检查扩展名
  97. if (in_array($file_ext, $ext_arr[$file_type]) === false) {
  98. return ResultWrapper::fail("上传文件扩展名是不允许的扩展名。");
  99. }
  100. #检查目录
  101. if (@is_dir($save_path) === false) {
  102. #创建目录
  103. if (!mkdir($save_path, intval($this->config['dchmod']), true)) {
  104. return ResultWrapper::fail("创建目录失败:{$save_path}");
  105. }
  106. }
  107. #检查目录写权限
  108. if (@is_writable($save_path) === false) {
  109. return ResultWrapper::fail("上传目录没有写权限。");
  110. }
  111. #移动文件
  112. $file_path = $save_path . $save_filename . '.' . $file_ext;
  113. if (move_uploaded_file($tmp_name, $file_path) === false) {
  114. return ResultWrapper::fail("上传文件失败。");
  115. }
  116. @chmod($file_path, intval($this->config['fchmod']));
  117. return ResultWrapper::success(array(
  118. 'file_path' => $file_path,
  119. ));
  120. }
  121. /**
  122. * 获取文件扩展名
  123. * @param string $filename
  124. * @return string
  125. */
  126. static public function getExtension($filename) {
  127. $temp_arr = explode(".", $filename);
  128. $file_ext = array_pop($temp_arr);
  129. $file_ext = trim($file_ext);
  130. return strtolower($file_ext);
  131. }
  132. }