PHP实现阿里云OSS文件上传(支持批量)

上传文件至阿里云OSS,整体逻辑是,文件先临时上传到本地,然后在上传到OSS,最后删除本地的临时文件(也可以不删,具体看自己的业务需求),具体实现流程如下:
 
1、下载阿里云OSS对象上传SDK(PHP版) 通过Github下载

2、解压后,可自行修改目录名称,以下为本人项目实例(aliyun_oss改过之后的名称)

项目目录结构如下:

PHP实现阿里云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文件上传就完成了,具体使用过程中有什么问题,可随时反馈,同时也欢迎提出各种建议,谢谢!

相关推荐