【PHP】实现阿里云OSS文件上传(支持批量)
上传文件至阿里云OSS,整体逻辑是,文件先临时上传到本地,然后在上传到OSS,最后删除本地的临时文件(也可以不删,具体看自己的业务需求),具体实现流程如下:
1、下载阿里云OSS对象上传SDK(PHP版) 通过Github下载
2、解压后,可自行修改目录名称,以下为本人项目实例(aliyun_oss改过之后的名称)
项目目录结构如下:
3、Index.php 为文件上传静态表单页
4、do_upload.php 为文件处理控制页,封装的代码如下:上传文件相关的辅助函数可以自行封装,本文是为了便于展示,全部放在一个文件中
1 <?php 2 /** 3 * @Class: do_upload.php 4 * @Description: 控制器 5 * @Date: 2019/10/16 6 */ 7 header("Content-Type:text/html;charset=utf-8"); 8 set_time_limit(0); 9 // error_reporting(E_ALL); 10 require __DIR__.\'/AliyunOss.php\'; 11 if(!empty($_FILES[\'oss_file\']) && !empty($_POST[\'type\'])){ 12 $file_arr = getFiles(); 13 $AliyunOss = new AliyunOss(); 14 foreach ($file_arr as $file){ 15 $res = upload_File($file,$type_name.\'/\'.$user_info[\'contact\'],$user_info); 16 if(isset($res[\'fname\']) && isset($res[\'dest\']) && isset($res[\'file_name\'])){ 17 $result = $AliyunOss->upload_file($res[\'dest\'],$res[\'fname\']); 18 if($result){ 19 //1、存入数据库 此处部分变量及入库代码补全 知道逻辑即可 20 $insert_time = date(\'Y-m-d H:i:s\',time()); 21 $fileData = array( 22 \'phone\' => "\'{$phone}\'", 23 \'company_name\' => "\'{$oss_db->escape($user_info[\'contact\'])}\'", 24 \'insert_time\' => "\'{$insert_time}\'", 25 \'file_name\' => "\'{$res[\'file_name\']}\'", 26 \'file_url\' => "\'{$result[\'oss_file\']}\'" 27 ); 28 $sql = "insert into `oss_file` (".implode(\',\', array_keys($fileData)).") values (".implode(\',\', array_values($fileData)).")"; 29 $oss_db->query($sql); 30 if($oss_db->insert_id()){ 31 //2、删除临时文件 32 unlink($res[\'dest\']); 33 } 34 } 35 } 36 } 37 echo \'上传成功\'; 38 header(\'Location:list.php\'); 39 die; 40 }else{ 41 echo \'上传失败\'; 42 } 43 44 /** 45 * 文件上传 46 * @description 47 * @param $file 48 * @param string $path 49 * @param $max_size 50 * @param $allowExt 51 * @return mixed 52 */ 53 function upload_File($file,$oss_dir = \'\',$user_info,$path = __DIR__.\'/temp\'){ 54 $filename=$file[\'name\']; 55 $temp_name=$file[\'tmp_name\']; 56 $error=$file[\'error\']; 57 $res = []; 58 if ($error==UPLOAD_ERR_OK) { 59 // if ($size>$max_size) { 60 // $res[\'mes\']=$filename."文件超过规定上传大小"; 61 // } 62 $ext = getExt($filename); 63 if (in_array($ext, array(\'exe\'))) { 64 $res[\'mes\']=$filename.\'非法的文件\'; 65 } 66 if (!is_uploaded_file($temp_name)) { 67 $res[\'mes\']=$filename."文件不是通过HTTP POST 方法上传上传过来的"; 68 } 69 70 if ($res) { 71 return $res; 72 } 73 74 if (!file_exists($path)) { 75 mkdir($path,0777,true); 76 chmod($path, 0777); 77 } 78 $fname = getUniName($filename,$user_info); 79 $destination = $path.\'/\'.$fname.\'.\'.$ext; 80 if (move_uploaded_file($temp_name, $destination)) { 81 $res[\'mes\'] = $filename.\'上传成功\'; 82 $res[\'dest\'] = $destination; 83 $res[\'fname\'] = $oss_dir.\'/\'.$fname.\'.\'.$ext; 84 $res[\'file_name\'] = $fname.\'.\'.$ext; 85 }else{ 86 $res[\'mes\']=$filename."文件上传失败"; 87 } 88 }else{ 89 switch ($error) { 90 case \'1\': 91 $res[\'mes\']="超过了配置文件上传文件的大小"; 92 break; 93 case \'2\': 94 $res[\'mes\']="超过表单设置上传文件文件的大小"; 95 break; 96 case \'3\': 97 $res[\'mes\']="文件部分被上传"; 98 break; 99 case \'4\': 100 $res[\'mes\']="没有文件被上传"; 101 102 break; 103 case \'6\': 104 $res[\'mes\']="没有找到临时目录"; 105 break; 106 case \'7\': 107 $res[\'mes\']="文件不可写"; 108 109 break; 110 default: 111 $res[\'mes\']="上传文件失败"; 112 break; 113 } 114 } 115 116 return $res; 117 118 } 119 /** 120 * 获得文件扩展名 121 * @param string $filename 上传文件名 122 * @return string 返回扩展名 123 */ 124 function getExt($filename){ 125 $arr=explode(\'.\', basename($filename)); 126 127 return end($arr); 128 } 129 /** 130 * 获得文件唯一扩展名 131 * @return string 经过md5后生成32位唯一的上传文件名 132 */ 133 function getUniName($fileName, $user_info) 134 { 135 $new_fileName = substr($fileName,0,strrpos($fileName,\'.\')); 136 $oss_db = new data_base(\'10.1.51.64\', \'root\', \'abc@123456\', \'dahua_oss\'); 137 $has_file = $oss_db->getRow("select * from `oss_file` where `phone` = \'{$user_info[\'phone\']}\' and locate(\'{$fileName}\',`file_url`)>0 "); 138 if ($has_file) { 139 $new_fileName .= \'-1\'; 140 } 141 return $new_fileName; 142 } 143 144 /** 145 * 整理多个文件 146 * @description 147 * @return mixed 148 */ 149 function getFiles(){ 150 $files = array(); 151 foreach($_FILES as $file){ 152 $fileNum=count($file[\'name\']); 153 for ($i=0; $i < $fileNum; $i++) { 154 $files[$i][\'name\']=$file[\'name\'][$i]; 155 $files[$i][\'type\']=$file[\'type\'][$i]; 156 $files[$i][\'tmp_name\']=$file[\'tmp_name\'][$i]; 157 $files[$i][\'error\']=$file[\'error\'][$i]; 158 $files[$i][\'size\']=$file[\'size\'][$i]; 159 } 160 } 161 return $files; 162 } 163 164 ?>
5、AliyunOss.php OSS文件上传接口类
1 <?php 2 /** 3 * @Class: AliyunOss.php 4 * @Description: 控制器 5 * @Date: 2019/10/16 6 */ 7 header("Content-Type:text/html;charset=utf-8"); 8 // error_reporting(E_ALL); 9 10 if (is_file(__DIR__ . \'/aliyun_oss/autoload.php\')) { 11 require_once __DIR__ . \'/aliyun_oss/autoload.php\'; 12 } 13 14 use OSS\OssClient; 15 use OSS\Core\OssException; 16 17 // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。 18 19 class AliyunOss 20 { 21 private $accessKeyId; 22 private $accessKeySecret; 23 private $endpoint; 24 private $bucket; 25 26 public function __construct() 27 28 { 29 require_once __DIR__ . \'/aliyun_oss/config.php\'; 30 $this->accessKeyId = $oss_config[\'accessKeyId\']; 31 $this->accessKeySecret = $oss_config[\'accessKeySecret\']; 32 // Endpoint以杭州为例,其它Region请按实际情况填写。 $endpoint="http://oss-cn-hangzhou.aliyuncs.com"; 33 $this->endpoint = $oss_config[\'endpoint\']; 34 // 存储空间名称 35 $this->bucket = $oss_config[\'bucket\']; 36 } 37 //$file_path oss文件名称 (支持中文如:商务/科技/项目计划.doc)会自动创建目录
//$file_name 由本地文件绝对路径加文件名包括后缀组成,例如/users/local/myfile.txt 38 public function upload_file($file_path, $file_name) 39 { 40 try { 41 $ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint); 42 $result = $ossClient->uploadFile($this->bucket, $file_name, $file_path);//$result[\'info\'][\'url\'] 返回上传成功的oss文件地址 43 $arr = array( 44 \'oss_file\' =>$result[\'info\'][\'url\'], 45 \'local_path\' => $file_name 46 ); 47 return $arr; 48 } catch (OssException $e) { 49 // printf(__FUNCTION__ . ": FAILED\n"); 50 // printf($e->getMessage() . "\n"); 51 log_msg(\'文件上传失败\',$e->getMessage()); 52 log_msg(\'文件上传失败\',$file_path.\'---\'.$file_name); 53 return false; 54 } 55 } 56 }
至此,OSS文件上传就完成了,具体使用过程中有什么问题,可随时反馈,同时也欢迎提出各种建议,谢谢!
版权声明:本文为guliang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。