zx-admin

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

Step 1. 初始化OSSClient
SDK与OSS后台服务所有的交互都是通过OSSClient完成的。通过以下代码,可以生成OSSClient的实例:

<?php

require_once \'/path/to/sdk/aliyun.php\';

use \Aliyun\OSS\OSSClient;

$client = OSSClient::factory(array(
    \'AccessKeyId\' => \'<access-key-id>\',
    \'AccessKeySecret\' => \'<access-key-secret>\',
));
由于SDK使用了命名空间机制,需要在文件开始声明使用 \Aliyun\OSS\OSSClient 类。

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 接口会返回 \Aliyun\OSS\Model\ObjectListing 对象,你可以通过对象的 getObjectSummarys 方法获取Object的列表。

Step 5. 下载Object
通过下面代码我们可以获取一个已经上传了的Object的内容:

<?php

$object = $client->getObject(array(
    \'Bucket\' => \'your-bucket-name\',
    \'Key\' => \'your-object-key\',
));

echo (string)$object;
事实上,getObject 方法返回了一个 \Aliyun\OSS\Model\OSSObject 的对象,此对象包含了Object的一些信息,以及一个可以用来读取object内容的resource类型的成员。

<?php

$object = $client->getObject(array(
    \'Bucket\' => \'your-bucket-name\',
    \'Key\' => \'your-object-key\',
));

echo "Key: " . $object->getKey() . "\n";
echo "Update Date: " . $object->getLastModified()->getTimestamp() . "\n";
echo "Content: \n";
echo stream_get_contents($object->getObjectContent()); // Print object\'s content.
Step 6. 处理异常
当我们执行一些错误的操作,比如试图获取一个不存在的bucket的Object列表的时候,SDK会抛出类型为 \Aliyun\OSS\Exceptions\OSSException 的异常;另外,由于网络错误等原因,client也有可能抛出 \Aliyun\Common\Exceptions\ClientException 异常。你可以catch这些异常:

<?php

try {
    $client->listObjects(array(
        \'Bucket\' => \'bucket-non-exist\',
    ));
} catch (\Aliyun\OSS\Exceptions\OSSException $ex) {
    echo "Error: " . $ex->getErrorCode() . "\n";
} catch (\Aliyun\Common\Exceptions\ClientException $ex) {
    echo "ClientError: " . $ex->getMessage() . "\n";
}
为了更简明地阐述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 请入群下载

 

分类:

技术点:

相关文章:

  • 2021-11-20
  • 2021-12-29
  • 2021-12-29
  • 2021-12-19
  • 2021-12-19
  • 2021-12-29
  • 2021-10-13
猜你喜欢
  • 2021-09-27
  • 2021-11-12
  • 2021-12-25
  • 2021-09-20
  • 2021-11-20
  • 2021-12-29
相关资源
相似解决方案