PHP实现阿里云OSS文件上传(支持批量)
上传文件至阿里云OSS,整体逻辑是,文件先临时上传到本地,然后在上传到OSS,最后删除本地的临时文件(也可以不删,具体看自己的业务需求),具体实现流程如下:
1、下载阿里云OSS对象上传SDK(PHP版) 通过Github下载
2、解压后,可自行修改目录名称,以下为本人项目实例(aliyun_oss改过之后的名称)
项目目录结构如下:
3、Index.php 为文件上传静态表单页
4、do_upload.php 为文件处理控制页,封装的代码如下:上传文件相关的辅助函数可以自行封装,本文是为了便于展示,全部放在一个文件中
<?php /** * @Class: do_upload.php * @Description: 控制器 * @Date: 2019/10/16 */ header("Content-Type:text/html;charset=utf-8"); set_time_limit(0); // error_reporting(E_ALL); require __DIR__.‘/AliyunOss.php‘; if(!empty($_FILES[‘oss_file‘]) && !empty($_POST[‘type‘])){ $file_arr = getFiles(); $AliyunOss = new AliyunOss(); foreach ($file_arr as $file){ $res = upload_File($file,$type_name.‘/‘.$user_info[‘contact‘],$user_info); if(isset($res[‘fname‘]) && isset($res[‘dest‘]) && isset($res[‘file_name‘])){ $result = $AliyunOss->upload_file($res[‘dest‘],$res[‘fname‘]); if($result){ //1、存入数据库 此处部分变量及入库代码补全 知道逻辑即可 $insert_time = date(‘Y-m-d H:i:s‘,time()); $fileData = array( ‘phone‘ => "‘{$phone}‘", ‘company_name‘ => "‘{$oss_db->escape($user_info[‘contact‘])}‘", ‘insert_time‘ => "‘{$insert_time}‘", ‘file_name‘ => "‘{$res[‘file_name‘]}‘", ‘file_url‘ => "‘{$result[‘oss_file‘]}‘" ); $sql = "insert into `oss_file` (".implode(‘,‘, array_keys($fileData)).") values (".implode(‘,‘, array_values($fileData)).")"; $oss_db->query($sql); if($oss_db->insert_id()){ //2、删除临时文件 unlink($res[‘dest‘]); } } } } echo ‘上传成功‘; header(‘Location:list.php‘); die; }else{ echo ‘上传失败‘; } /** * 文件上传 * @description * @param $file * @param string $path * @param $max_size * @param $allowExt * @return mixed */ function upload_File($file,$oss_dir = ‘‘,$user_info,$path = __DIR__.‘/temp‘){ $filename=$file[‘name‘]; $temp_name=$file[‘tmp_name‘]; $error=$file[‘error‘]; $res = []; if ($error==UPLOAD_ERR_OK) { // if ($size>$max_size) { // $res[‘mes‘]=$filename."文件超过规定上传大小"; // } $ext = getExt($filename); if (in_array($ext, array(‘exe‘))) { $res[‘mes‘]=$filename.‘非法的文件‘; } if (!is_uploaded_file($temp_name)) { $res[‘mes‘]=$filename."文件不是通过HTTP POST 方法上传上传过来的"; } if ($res) { return $res; } if (!file_exists($path)) { mkdir($path,0777,true); chmod($path, 0777); } $fname = getUniName($filename,$user_info); $destination = $path.‘/‘.$fname.‘.‘.$ext; if (move_uploaded_file($temp_name, $destination)) { $res[‘mes‘] = $filename.‘上传成功‘; $res[‘dest‘] = $destination; $res[‘fname‘] = $oss_dir.‘/‘.$fname.‘.‘.$ext; $res[‘file_name‘] = $fname.‘.‘.$ext; }else{ $res[‘mes‘]=$filename."文件上传失败"; } }else{ switch ($error) { case ‘1‘: $res[‘mes‘]="超过了配置文件上传文件的大小"; break; case ‘2‘: $res[‘mes‘]="超过表单设置上传文件文件的大小"; break; case ‘3‘: $res[‘mes‘]="文件部分被上传"; break; case ‘4‘: $res[‘mes‘]="没有文件被上传"; break; case ‘6‘: $res[‘mes‘]="没有找到临时目录"; break; case ‘7‘: $res[‘mes‘]="文件不可写"; break; default: $res[‘mes‘]="上传文件失败"; break; } } return $res; } /** * 获得文件扩展名 * @param string $filename 上传文件名 * @return string 返回扩展名 */ function getExt($filename){ $arr=explode(‘.‘, basename($filename)); return end($arr); } /** * 获得文件唯一扩展名 * @return string 经过md5后生成32位唯一的上传文件名 */ function getUniName($fileName, $user_info) { $new_fileName = substr($fileName,0,strrpos($fileName,‘.‘)); $oss_db = new data_base(‘10.1.51.64‘, ‘root‘, ‘‘, ‘dahua_oss‘); $has_file = $oss_db->getRow("select * from `oss_file` where `phone` = ‘{$user_info[‘phone‘]}‘ and locate(‘{$fileName}‘,`file_url`)>0 "); if ($has_file) { $new_fileName .= ‘-1‘; } return $new_fileName; } /** * 整理多个文件 * @description * @return mixed */ function getFiles(){ $files = array(); foreach($_FILES as $file){ $fileNum=count($file[‘name‘]); for ($i=0; $i < $fileNum; $i++) { $files[$i][‘name‘]=$file[‘name‘][$i]; $files[$i][‘type‘]=$file[‘type‘][$i]; $files[$i][‘tmp_name‘]=$file[‘tmp_name‘][$i]; $files[$i][‘error‘]=$file[‘error‘][$i]; $files[$i][‘size‘]=$file[‘size‘][$i]; } } return $files; } ?>
5、AliyunOss.php OSS文件上传接口类
<?php /** * @Class: AliyunOss.php * @Description: 控制器 * @Date: 2019/10/16 */ header("Content-Type:text/html;charset=utf-8"); // error_reporting(E_ALL); if (is_file(__DIR__ . ‘/aliyun_oss/autoload.php‘)) { require_once __DIR__ . ‘/aliyun_oss/autoload.php‘; } use OSS\OssClient; use OSS\Core\OssException; // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。 class AliyunOss { private $accessKeyId; private $accessKeySecret; private $endpoint; private $bucket; public function __construct() { require_once __DIR__ . ‘/aliyun_oss/config.php‘; $this->accessKeyId = $oss_config[‘accessKeyId‘]; $this->accessKeySecret = $oss_config[‘accessKeySecret‘]; // Endpoint以杭州为例,其它Region请按实际情况填写。 $endpoint="http://oss-cn-hangzhou.aliyuncs.com"; $this->endpoint = $oss_config[‘endpoint‘]; // 存储空间名称 $this->bucket = $oss_config[‘bucket‘]; } //$file_path oss文件名称 (支持中文如:商务/科技/项目计划.doc)会自动创建目录 //$file_name 由本地文件绝对路径加文件名包括后缀组成,例如/users/local/myfile.txt public function upload_file($file_path, $file_name) { try { $ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint); $result = $ossClient->uploadFile($this->bucket, $file_name, $file_path);//$result[‘info‘][‘url‘] 返回上传成功的oss文件地址 $arr = array( ‘oss_file‘ =>$result[‘info‘][‘url‘], ‘local_path‘ => $file_name ); return $arr; } catch (OssException $e) { // printf(__FUNCTION__ . ": FAILED\n"); // printf($e->getMessage() . "\n"); log_msg(‘文件上传失败‘,$e->getMessage()); log_msg(‘文件上传失败‘,$file_path.‘---‘.$file_name); return false; } } }
至此,OSS文件上传就完成了,具体使用过程中有什么问题,可随时反馈,同时也欢迎提出各种建议,谢谢!
相关推荐
hedongli 2020-09-01
Purgatory00 2020-09-15
zyyjay 2020-11-09
xuebingnan 2020-11-05
samtrue 2020-11-22
stefan0 2020-11-22
yifangs 2020-10-13
songshijiazuaa 2020-09-24
hebiwtc 2020-09-18
天步 2020-09-17
83911535 2020-11-13
whatsyourname 2020-11-13
zhouyuqi 2020-11-10
Noneyes 2020-11-10
mathchao 2020-10-28
王志龙 2020-10-28
wwwsurfphpseocom 2020-10-28