对小公司而言,使用阿里云oss比直接买硬盘要划算的多,不管从存储性价比上还是从网速负载上。最近因为公司的项目有比较大的图片存储访问需求,所以决定使用阿里云的oss。

在研究了一下以后,摆着不自己造轮子的原则,决定使用AliyunOss,国人laravel高手JohnLui封装的一个阿里云oss的操作库。

AliyunOSS 是阿里云 OSS 官方 SDK 的 Composer 封装,支持任何 PHP 项目,包括 Laravel、Symfony、TinyLara 等等。Github 地址:https://github.com/johnlui/AliyunOSS

安装

将以下内容增加到 composer.json:

1
2
3
4
5
require: {
 
    "johnlui/aliyun-oss": "dev-master"
 
}

然后运行 `composer update。

使用(以 Laravel 为例)

构建 Service 文件

新建 `app/services/OSS.php`,内容可参考:OSSExample.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2016/9/6
 * Time: 10:14
 */
namespace App\Services;
 
use JohnLui\AliyunOSS\AliyunOSS;
 
use Config;
 
class OSS {
 
    private $ossClient;
 
    public function __construct($isInternal = false)
    {
        $serverAddress = $isInternal ? Config::get('oss.ossServerInternal') : Config::get('oss.ossServer');
        $this->ossClient = AliyunOSS::boot(
            $serverAddress,
            Config::get('oss.AccessKeyId'),
            Config::get('oss.AccessKeySecret')
        );
    }
 
    // 默认上传文件使用内网,免流量费
    public static function upload($ossKey, $filePath, $isInternal = true)
    {
        $oss = new OSS($isInternal);
        $oss->ossClient->setBucket('你的Bucket名字');
        $oss->ossClient->uploadFile($ossKey, $filePath);
    }
    /**
     * 直接把变量内容上传到oss
     * @param $osskey
     * @param $content
     */
    public static function uploadContent($osskey,$content)
    {
        $oss = new OSS(true); // 上传文件使用内网,免流量费
        $oss->ossClient->setBucket('你的Bucket名字');
        $oss->ossClient->uploadContent($osskey,$content);
    }
 
    /**
     * 删除存储在oss中的文件
     *
     * @param string $ossKey 存储的key(文件路径和文件名)
     * @return
     */
    public static function deleteObject($ossKey)
    {
        $oss = new OSS(true); // 上传文件使用内网,免流量费
 
        return $oss->ossClient->deleteObject('你的Bucket名字', $ossKey);
    }
 
    /**
     * 复制存储在阿里云OSS中的Object
     *
     * @param string $sourceBuckt 复制的源Bucket
     * @param string $sourceKey - 复制的的源Object的Key
     * @param string $destBucket - 复制的目的Bucket
     * @param string $destKey - 复制的目的Object的Key
     * @return Models\CopyObjectResult
     */
    public function copyObject($sourceBuckt, $sourceKey, $destBucket, $destKey)
    {
        $oss = new OSS(true); // 上传文件使用内网,免流量费
 
        return $oss->ossClient->copyObject($sourceBuckt, $sourceKey, $destBucket, $destKey);
    }
 
    /**
     * 移动存储在阿里云OSS中的Object
     *
     * @param string $sourceBuckt 复制的源Bucket
     * @param string $sourceKey - 复制的的源Object的Key
     * @param string $destBucket - 复制的目的Bucket
     * @param string $destKey - 复制的目的Object的Key
     * @return Models\CopyObjectResult
     */
    public function moveObject($sourceBuckt, $sourceKey, $destBucket, $destKey)
    {
        $oss = new OSS(true); // 上传文件使用内网,免流量费
 
        return $oss->ossClient->moveObject($sourceBuckt, $sourceKey, $destBucket, $destKey);
    }
 
    public static function getUrl($ossKey)
    {
        $oss = new OSS();
        $oss->ossClient->setBucket('你的Bucket名字');
        return $oss->ossClient->getUrl($ossKey, new \DateTime("+1 day"));
    }
 
    public static function createBucket($bucketName)
    {
        $oss = new OSS();
        return $oss->ossClient->createBucket($bucketName);
    }
 
    public static function getAllObjectKey($bucketName)
    {
        $oss = new OSS();
        return $oss->ossClient->getAllObjectKey($bucketName);
    }
 
    /**
     * 获取指定Object的元信息
     *
     * @param  string $bucketName 源Bucket名称
     * @param  string $key 存储的key(文件路径和文件名)
     * @return object 元信息
     */
    public static function getObjectMeta($bucketName, $osskey)
    {
        $oss = new OSS();
        return $oss->ossClient->getObjectMeta($bucketName, $osskey);
    }
}

  

增加相关配置

在 app/config/oss.php 中增加以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2016/9/6
 * Time: 10:17
 */
return [
    'useInternal' => false,//是否使用OSS内网传输来省流量
    'ossServer' => '服务器外网地址', //青岛为 http://oss-cn-qingdao.aliyuncs.com
    'ossServerInternal' => '服务器内网地址', //青岛为 http://oss-cn-qingdao-internal.aliyuncs.com
    'AccessKeyId' => '阿里云给的AccessKeyId',
    'AccessKeySecret' => '阿里云给的AccessKeySecret',
];

  

使用

1
2
3
4
5
6
7
8
9
use App\Services\OSS;
 
OSS::upload('文件名', '本地路径'); // 上传一个文件
 
echo OSS::getUrl('某个文件的名称'); // 打印出某个文件的外网链接
 
OSS::createBucket('一个字符串'); // 新增一个 Bucket。注意,Bucket 名称具有全局唯一性,也就是说跟其他人的 Bucket 名称也不能相同。
 
OSS::getAllObjectKey('某个 Bucket 名称'); // 获取该 Bucket 中所有文件的文件名,返回 Array。

  

常见问题:

① Undefined index: host

解决方案:https://github.com/johnlui/AliyunOSS/issues/9

② The specified bucket is not valid.

错误原因:你们的内外地址肯定是给了http://****.oss-cn-beijing.aliyuncs.com 这里的*是指bucket名字,  然后你们调用方法的时候有传入了一个bucket的名字, 然后它给你们拼接起来 就变成了http://bucketName.bucketName.oss-cn..........com

解决方案:在配置文件里面ALIOSS_SERVER=http://oss-cn-beijing.aliyuncs.com   比如这个外网地址前面不要加上 bucket名字

项目存在的不足:

目前调用SDK没有一个状态值返回,所以不知道上传是否会存在BUG,过段时间尽量Fork并修改一下。

个人建议:

尽量使用laravel自带的job和queue来完成upload操作。

laravel下使用阿里云oss上传图片的更多相关文章

  1. vue用阿里云oss上传图片使用分片上传只能上传100kb以内的解决办法

    首先,vue和阿里云oss上传图片结合参考了 这位朋友的 https://www.jianshu.com/p/645f63745abd 文章,成功的解决了我用阿里云oss上传图片前的一头雾水. 该大神 ...

  2. The difference between the request time and the current time is too large.阿里云oss上传图片报错

    The difference between the request time and the current time is too large. 阿里云oss上传图片的时候报错如上, 解决办法,把 ...

  3. laravel使用阿里云OSS上传图片

    需要自己注册阿里云账号并且开通oss服务,建立Bucket存储空间,此步骤不做演示 一.composer安装:使用composer在项目根目录执行以下命令 composer require johnl ...

  4. 阿里云oss上传图片

    1.首先我们要下载阿里云oss的sdk包:(可以下载原版的,改过的通用版在本人的百度云,嘎嘎嘎~) 2.下载好之后放到项目文件目录里面 3.要在需要的控制器引用这个sdk文件例如: include(& ...

  5. Laravel 下结合阿里云邮件推送服务

    最近在学习laravel做项目开发,遇到注册用户推送邮件的问题,之前用java做的时候是自己代码写的,也就是用ECS推送邮件,但是现在转php的laravel了就打算用php的邮件发送功能来推送邮件, ...

  6. 阿里云OSS上传图片,并使用图片服务裁切

    <?php use OSS\OssClient; require_once './autoload.php'; // test $bucket = "在阿里云设置的bucket名字(这 ...

  7. 关于阿里云OSS上传图片之后会被旋转90度的解决办法

    原文:https://www.cnblogs.com/wuhjbk/p/10133596.html 问题描述:正常的图片前端上传到oss成功之后的资源地址.在html上引用的时候被旋转了90度oss资 ...

  8. 使用阿里云OSS,上传图片时报错:java.lang.ClassNotFoundException:org.apache.http.ssl.TrustStrategy

    问题产生的原因就是jar包版本问题,阿里的SDk引入的pom中依赖的httpclient和httpcore版本高于当前项目中已经设置的版本. 解决: 删除低版本后,更新下项目.

  9. 阿里云oss上传图片报错,The OSS Access Key Id you provided does not exist in our records.解决方法

    vue项目 1.安装OSS的Node SDK npm install ali-oss --save 2.参考官方提示https://help.aliyun.com/document_detail/11 ...

随机推荐

  1. 黑马程序员——JAVA基础之数组

    ------- android培训.java培训.期待与您交流! ---------- 数组: 数组的定义: 数组是相同类型数据的集合, 描述的是相同类型的若干个数据按照一定的先后顺序排列组合而成,其 ...

  2. GDI+中GIF图片的显示

    某位网友曾经问过我GDI+中Gif图像显示的问题,一直没时间给你写,在此致歉.我把这篇文章送给他. 一.GIF格式介绍 1.概述 GIF(Graphics Interchange Format,图形交 ...

  3. java 类型转json格式

    json-lib-2.4-jdk15.jar List<People> mapPersonTypes = null; private JSONArray json_mapPersonTyp ...

  4. android:ScrollView嵌套ListView的问题

    在ScrollView中嵌套使用ListView,看起来ListView只会显示一行多一点,不能滑动.ListView的高度怎么改都有问题,与预期不符合.搜索了一些解决方案,我觉得最好不要用这样的设计 ...

  5. Python中的lambda函数

    今天在看书的时候,看到了这样的一条语句: if isinstance(value,int) or isinstance(value,float): split_function=lambda row: ...

  6. 数据库之mysql

    安装mysql-server时连同客户端与perl环境一起安装了 centos6.5安装mysql[root@localhost ~]# yum install mysql-server Instal ...

  7. 在没有spineRunTime情况下手动使用spine数据

    用spine做了一些简单UI动画,结果发现游戏用的cocos2dx版本太低了,无法集成spineRunTime,无奈只好把spine记下的关键帧数据抄到一个txt文件中,然后读取txt,再自己写代码播 ...

  8. pythonchallenge关卡破解

    第一关:pow(2,38) 第二关: import string table = str.maketrans(string.ascii_lowercase, string.ascii_lowercas ...

  9. 服务器安全狗,支持Linux/windows

    安全狗: www.safedog.cn 防DDOS  sql注入检测

  10. C# XML与Json之间相互转换实例详解

    对于这转换其实很简单,其中最重要的就是先要引用类库.可以到官网进行下载引用http://json.codeplex.com. XML转换为Json字符串 string xml = @"< ...