全站搜索

亚马逊s3-OSS存储文件上传读取接口

网站开发 395

专业做网站的都知道,OSS存储是个好东西,如果你想网站上放个视频,如果采用第三方优酷、土豆视频,有很多广告,放在自己网站上非常不友好。如果直接放在网站服务器,则占用很多带宽,增加服务器负担。所以OSS存储的出现,解决了这个问题,速度快又不占用服务器带宽,又便宜。

还可以利用OSS存储,实现多服务器部署网站。

国外网站如何将资料存在oss,除了阿里云在亚马逊也同样有类似的服务Amazon S3对象存储

这里用的的是 thinkphp3.2 和 亚马逊s3接口

接口实例地址:

 

新建一个class

引入api文件

 

Vendor(‘Amazon.autoloader’);

use Aws\S3\S3Client;

use Aws\S3\MultipartUploader;

 

class AwsFile

{

    public $key;

public $secret;

//链接亚马逊服务器

   /**

     * Aws类初始化

     *

     */

    public function __construct()

    {

       

        $this->key =’xxxxxXXXX’ ;//key

        $this->secret = ‘xxxxxXXXXXXXX’;//secret

        $this->region = “ap-southeast-1”;//区域

        $this->version = ‘latest’;//版本号

        $this->endpoint =’http://s3.ap-southeast-1.amazonaws.com’;//公网访问地址

        $this->bucket = ‘xxxxx’;//桶

        try {

         

            $credentials = new \Aws\Credentials\Credentials($this->key, $this->secret);

            $this->client = new \Aws\S3\S3Client([

                ‘version’ => $this->version,

                ‘region’ => $this->region,

                ‘credentials’ => $credentials,

                ‘endpoint’ => $this->endpoint,

                //设置访问权限  公开,不然访问不了

                ‘ACL’    => ‘public-read’,

//                ‘debug’   => true

            ]);

        } catch (Exception $e) {

            $msg = $e->getMessage();

            Log::add(__PUBLIC_ . ‘|s3ImageConstruct’, $msg);

            return false;

        }

        return true;

 

    }

 

//基础上传

    /**

     * upload file 基础上传

     * name 文件名

     * fileUrl 文件路径(绝对地址)

     */

    public function uploadFile($file_name, $file_path,$dir)

    {

        $key = $file_name;

        $fileUrl = $file_path;

        if (!file_exists($fileUrl)) {

            return  “当前目录中,文件” . $fileUrl . “不存在”;

        }

        try {

            $result = $this->client->putObject([

                ‘Bucket’ => $this->bucket,

                ‘Key’ => trim($dir.$key),

                ‘Body’ => fopen($fileUrl, ‘rb’),

                ‘ACL’    => ‘public-read’,

            ]);

            $fileUrl = $result->get(‘ObjectURL’);

            return $fileUrl;

        } catch (Exception $e) {

            $msg = $e->getMessage();

           

            return $msg;

        }

    }

 

 

    /**

     * 自定义分段上传

     */

    public function multipartUploader($file_name, $file_path)

    {

        $source = $file_path;

        //多部件上传

        $uploader = new MultipartUploader($this->client, $source, [

            //存储桶

            ‘bucket’ => $this->bucket,

            //上传后的新地址

            ‘key’    => $file_name,

            //设置访问权限  公开,不然访问不了

            ‘ACL’    => ‘public-read’,

            //分段上传

            ‘before_initiate’ => function (\Aws\Command $command) {

                // $command 是CreateMultipartUpload操作

                $command[‘CacheControl’] = ‘max-age=3600’;

            },

            ‘before_upload’   => function (\Aws\Command $command) {

                // $command 是一个UploadPart操作

                $command[‘RequestPayer’] = ‘requester’;

            },

            ‘before_complete’ => function (\Aws\Command $command) {

                // $command 是一个CompleteMultipartUpload操作

                $command[‘RequestPayer’] = ‘requester’;

            },

        ]);

        try {

            $result = $uploader->upload();

            //上传成功–返回上传后的地址

            $resultOne = $this->client->getObjectUrl($this->bucket, $file_name);

            $data = [

                ‘type’ => ‘1’,

                ‘data’ => urldecode($result[‘ObjectURL’]),

                ‘resultOne’ => $resultOne,

            ];

        } catch (Aws\Exception\MultipartUploadException $e) {

            //上传失败–返回错误信息

            $uploader =  new MultipartUploader($this->client, $source, [

                ‘state’ => $e->getState(),

            ]);

            $data = [

                ‘type’ => ‘0’,

                ‘data’ =>  $e->getMessage(),

            ];

        }

        return $data;

    }

 

 /**

     * s3根据文件名称获取url

     * fileName 文件名称

     * publicPath 证书路径

     * expire 过期时间

     * $result = $this->client->getObjectUrl($this->bucket, $name);//此方法将返回给定存储桶和密钥的未签名 URL。

     */

    public function getFileUrl($fileName, $publicPath, $expire = 1)

    {

        if (empty($this->bucket)) {

            return  “”;

        }

        try {

            //创建预签名url

            $cmd = $this->client->getCommand(‘GetObject’, [

                ‘Bucket’ => $this->bucket,

                ‘Key’ => trim($fileName)

            ]);

            $request = $this->client->createPresignedRequest($cmd, ‘+’ . $expire . ‘weeks’);

            $presignedUrl = (string)$request->getUri();//获取签名对象的 URL

            //检验访问url是否有效

            $array = get_headers($presignedUrl, 1);

            //dump($array);

            if (preg_match(‘/200/’, $array[0])) {

                //Log::add(__PUBLIC_ . ‘|s3GetFileUrlSuccess’, “下载证书文件成功,url:”.$presignedUrl.”fileName”.$fileName);

                return $presignedUrl;

            } else {

                

                return $presignedUrl ;

                exit;

            }

        } catch (Aws\S3\Exception\S3Exception $e) {

            $msg = $e->getMessage();

          

            return false;

        }

    }

 

上一篇: 下一篇:

相关推荐

  • 做万元以上的高端定制网站 值得吗?

    341

    技术进步会进一步消减技术产品成本。请记住这样一句话。 例证:近十年手机、电脑等科技产品价格大幅下降,动力来自于科技进步。 网站设计也是如此。 十年前,一个简单的企业网站,动辄数千元乃至近万元,而大型门户网站、资讯网站、平台网站、系统网站,建站成本...

    查看全文
  • 「什么是关键词优化」网站优化不要投机取巧追求快速效果

    357

      作为一个网站来说,在竞争越来越激烈的情况下,去做网站优化的时候要知道是一个长期的过程。在这个阶段中做基本优化工作的时候,千万不要投机取巧。      要立足网站实际,根据制定的seo优化方案来完成,这样才能够对网站高质量内容带来的收录效...

    查看全文
  • 分心时代 如何设计专注型网站?

    391

    不妨自我测验一下:你大概间隔几分钟会拿起手机?你又有多长时间没有持续看完一本书? 这是一个分心的时代。这个时代的特征就是——不断被打扰、无法持续在一件事情上投入时间和精力。 包括网站的用户、小程序的使用者,也存在这样的特点。   分心时代的网站设...

    查看全文
  • 中国风网站,基本要素有哪些?如何抓“形”传“神”设计展示中国风?

    377

    什么是中国风?近些年来刮起了一股追求无形却有形的文化风暴,我们能隐隐约约的知道什么是中国文化特有,也知道隐约的知道如何表达一个中国风的底蕴。但是这个隐约总是无形的,可能触发到某一个点的时候,那么结合五千年来出现的文化特点,或许就能摸到了中国风的门...

    查看全文
展开更多