• 阿里OSS存储,php版demo


    最近项目移到云服务器,所以需要处理一下

    Step 1. 初始化OSSClient
    SDK与OSS后台服务所有的交互都是通过OSSClient完成的。通过以下代码,可以生成OSSClient的实例:
    
    <?php
    
    require_once '/path/to/sdk/aliyun.php';
    
    use AliyunOSSOSSClient;
    
    $client = OSSClient::factory(array(
        'AccessKeyId' => '<access-key-id>',
        'AccessKeySecret' => '<access-key-secret>',
    ));
    由于SDK使用了命名空间机制,需要在文件开始声明使用 AliyunOSSOSSClient 类。
    
    OSSClient使用工厂方法构建了一个OSSClient实例,此方法接收一个array作为输入参数;array中的 AccessKeyId 和 AccessKeySecret 是由系统分配给用户的ID对,用于标识用户,为访问OSS做签名验证。
    
    我们看到,上面的例子通过在array中设置 key-value 对来传递参数。之后要介绍的大部分SDK接口也是通过这种形式来使用的。
    
    Step 2. 创建Bucket
    你可以通过以下代码来创建Bucket:
    
    <?php
    
    $client->createBucket(array(
        'Bucket' => 'your-bucket-name',
    ));
    通过指定 Bucket 参数来制定Bucket的名字,Bucket的名称有全局唯一性,请尽量保证你的Bucket名称不与别人的重复。
    
    关于Bucket的命名规范,参见 Bucket命名规范 。
    
    Step 3. 上传Object
    Object可以简单的理解成一个文件,你可以通过以下代码把Object上传到一个Bucket中:
    
    <?php
    $client->putObject(array(
        'Bucket' => 'your-bucket-name',
        'Key' => 'your-object-key',
        'Content' => 'This is my content',
    ));
    我们通过 Bucket 和 Key 来指定Object所在的Bucket以及Object的名字。 Content 为Object的实际内容,它可以为字符串或者是资源类型(resource),当 Content 类型为resource时,你必须指定Object的大小(以字节为单位)。
    
    比如:
    
    <?php
    
    $client->putObject(array(
        'Bucket' => 'your-bucket-name',
        'Key' => 'your-object-key',
        'Content' => fopen('/path/to/file', 'r'),
        'ContentLength' => filesize('/path/to/file'),
    ));
    关于Object的命名规范,参见 Object命名规范 。
    
    关于上传Object更详细的信息,参见 上传Object 。
    
    Step 4. 获取Object列表
    你可能想知道在一个Bucket中存的Object是什么,通过 listObjects 接口可以达到这一目的:
    
    <?php
    
    $objectListing = $client->listObjects(array(
        'Bucket' => 'your-bucket-name',
    ));
    
    foreach ($objectListing->getObjectSummarys() as $objectSummary) {
        echo $objectSummary->getKey();
    }
    listObjects 接口会返回 AliyunOSSModelObjectListing 对象,你可以通过对象的 getObjectSummarys 方法获取Object的列表。
    
    Step 5. 下载Object
    通过下面代码我们可以获取一个已经上传了的Object的内容:
    
    <?php
    
    $object = $client->getObject(array(
        'Bucket' => 'your-bucket-name',
        'Key' => 'your-object-key',
    ));
    
    echo (string)$object;
    事实上,getObject 方法返回了一个 AliyunOSSModelOSSObject 的对象,此对象包含了Object的一些信息,以及一个可以用来读取object内容的resource类型的成员。
    
    <?php
    
    $object = $client->getObject(array(
        'Bucket' => 'your-bucket-name',
        'Key' => 'your-object-key',
    ));
    
    echo "Key: " . $object->getKey() . "
    ";
    echo "Update Date: " . $object->getLastModified()->getTimestamp() . "
    ";
    echo "Content: 
    ";
    echo stream_get_contents($object->getObjectContent()); // Print object's content.
    Step 6. 处理异常
    当我们执行一些错误的操作,比如试图获取一个不存在的bucket的Object列表的时候,SDK会抛出类型为 AliyunOSSExceptionsOSSException 的异常;另外,由于网络错误等原因,client也有可能抛出 AliyunCommonExceptionsClientException 异常。你可以catch这些异常:
    
    <?php
    
    try {
        $client->listObjects(array(
            'Bucket' => 'bucket-non-exist',
        ));
    } catch (AliyunOSSExceptionsOSSException $ex) {
        echo "Error: " . $ex->getErrorCode() . "
    ";
    } catch (AliyunCommonExceptionsClientException $ex) {
        echo "ClientError: " . $ex->getMessage() . "
    ";
    }
    为了更简明地阐述SDK的使用,本文档的大多数实例代码都没有对异常进行处理。但是,在实际的开发中,为了实现程序的健壮性,你都应该捕获这些异常并处理它们。

    一个实际的

    public function zz() {
    
            if (IS_POST) {
                P($_FILES);
    
                foreach ($_FILES as $value) {
                    foreach ($value["error"] as $k => $v) {
                        if ($v == 1) {
                            echo $err = $value['name'][$k] . '超过了php.ini的upload_max_filesize最大上传文件大小';
    //                        return false;
                        } elseif ($v == 2) {
                            echo $err = $value['name'][$k] . '超过了浏览器表单的最大上传文件大小';
    //                        return false;
                        } elseif ($v == 3) {
                            echo $err = $value['name'][$k] . '上传的文件仅部分上传';
    //                        return false;
                        } elseif ($v == 4) {
                            echo $err = $value['name'][$k] . '没有上传文件';
    //                        return false;
                        } elseif ($v == 6) {
                            echo $err = $value['name'][$k] . '缺少系统临时文件夹或者无写入权限';
    //                        return false;
                        } elseif ($v == 7) {
                            echo $err = $value['name'][$k] . '系统错误,写入磁盘失败';
    //                        return false;
                        } elseif ($v == 8) {
                            echo $err = $value['name'][$k] . 'PHP扩展程序停止文件上传';
    //                        return false;
                        }
                    }
                }
    
    //            处理文件数组
                $bucketName = Common::getBucketName();
                $ossClient = Common::getOssClient();
                if (is_null($ossClient)) {
                    $err = 'oss对象获取失败!';
                    return false;
                }
                $upload_root = C('SERVERFILE_ROOT');
                $category = 'zx';
                $folder = "/{$category}/" . date('Ym/d', time());
    
                echo $upload_folder = $upload_root . $folder;
                $objectListing = $ossClient->createObjectDir($bucketName, $upload_folder); //创建目录,防止时间24点出现目录错误 
                 upload_folder 注意要为 'zx/tt/ll',前后不要有/不然会出错
                if ($objectListing['info']['http_code'] != 200) {
                    myLog($objectListing, 'oss_log');
                    echo $err = '文件创建失败';
                }
                $filename = array();
                foreach ($_FILES as $value) {
                    foreach ($value['tmp_name'] as $k => $v) {
                        $filename[$k]['name'] = $value['name'][$k];
                        $filename[$k]['local_path'] = $value['tmp_name'][$k];
                        $filename[$k]['folder'] = $upload_folder;
                        $filename[$k]['size'] = $value['size'][$k];
                        $filename[$k]['type'] = $value['type'][$k];
                        $des_name_suffix = substr(strrchr($value['name'][$k], '.'), 1);
                        $des_name = microtime_format('YmdHisx', microtime(true)) . rand(100, 999) . rand(10, 99);
                        $filename[$k]['file_name'] = $des_name . '.' . $des_name_suffix;
                        $filename[$k]['extension'] = $des_name_suffix;
                        $filename[$k]['destination_name'] = $bucketName . $filename[$k]['folder'] . $des_name . '.' . $des_name_suffix; //存储在OSS里面最后的名字
                    }
                }
    
                $return_array = array();
                foreach ($filename as $kk => $vv) {
                    $return = $ossClient->uploadFile($bucketName, ($upload_folder . '/' . $vv['file_name']), $vv['local_path']);

    ($upload_folder . '/' . $vv['file_name'])注意这个目录一定要是 'zx/tt/ll',前后不要有/不然会出错

    if ($return['info']['http_code'] == 200) { $return_array[$kk]['savename'] = $vv['file_name']; $return_array[$kk]['type'] = $vv['type']; $return_array[$kk]['size'] = $vv['size']; $return_array[$kk]['extension'] = $vv['extension']; $return_array[$kk]['savepath'] = '/' . $upload_folder . $vv['file_name']; $return_array[$kk]['hash'] = $return['content-md5']; $return_array[$kk]['oss_url'] = $return['info']['url']; } else { myLog($return, 'api_log'); $err = 'HTTP头部信息返回错误!'; } } P($filename); P($return_array); } $this->display(); }

    实例demo 请入群下载

  • 相关阅读:
    js 中的 EventLoop
    线程的并发工具类
    xpath获取某个节点下的全部字节点的文本
    2020中国 .NET开发者大会精彩回顾:葡萄城高性能表格技术解读
    .NET 控件集 ComponentOne V2020.0 Update3 发布,正式支持 .NET 5
    log4net配置
    TP5.1 爬虫
    pip下载慢
    TP5.1 二维码生成
    composer插件集合
  • 原文地址:https://www.cnblogs.com/zx-admin/p/7132952.html
Copyright © 2020-2023  润新知