友盟+搜索

{{errorMsg}}

开通服务

开通服务,创建空间用于文件存储,参考 接入指引

SDK下载

通过 控制台 进入 SDK 下载页面,下载 PHP SDK (含 Demo)

运行 Demo

Demo 位于 SDK 压缩包的 example 目录下,分别在 upload.php 和 manage.php 的初始化配置中,填入开发者自己的AK、SK 和 namespace 后,运行即可。

如何获取 AK 和 SK? 进入控制台 操作路径为:我的百川 -> 百川秘钥,如图示:

SDK 上传接口

统一说明

所有接口都是集成到 AlibabaImage 类中。 返回值为 array 结构。根据 array 中 isSuccess 判断是否调用成功。如果失败,详细信息请参考 状态码 一节 例如:

array(8) {
  ["id"]=>
  string(36) "6bec5bca-94f8-4192-afd4-1a7f8cafb254"
  ["eTag"]=>
  string(32) "85EDBFBAABAF0A7A6E5A8D15FFB9817F"
  ["uploadId"]=>
  string(32) "7BABCE44773A4AFDBFBD2E4A9317B475"
  ["dir"]=>
  string(6) "/super"
  ["requestId"]=>
  string(36) "bb66d0f4-e71c-4790-afa6-3f61ed77a773"
  ["name"]=>
  string(10) "superfile4"
  ["partNumber"]=>
  int(1)
  ["isSuccess"]=>
  bool(true)
}

出错返回示例:

array(4) {
  ["message"]=>
  string(13) "InternalError"
  ["requestId"]=>
  string(36) "390671e3-d2a8-4425-be76-c081119d5813"
  ["code"]=>
  string(13) "InternalError"
  ["isSuccess"]=>
  bool(false)
} 

上传策略模型

上传部分需要传入 uploadPolicy 对象,定义详见 upload_policy.class.php。其中初始化 type 类型为 TOP,namespace必填。

参数 说明
namespace 存储服务ID,开发者创建空间时指定的空间唯一标示。type = TOP 时必填
bucket 可忽略
expiration token的过期时间,unixtime,单位毫秒。举例如下: (System.currentTimeMillis() + 3600 * 1000)
insertOnly 文件上传是否可覆盖 0: 可覆盖, 1: 不可覆盖 默认为可覆盖的模式
dir 指定上传文件的存储路径 如果不指定则会使用接口中传入的dir参数 如果接口中也没有传入dir参数,则默认使用根目录
name 指定上传文件的存储文件名
sizeLimit 指定上传文件大小的最大值(单位:字节) 各种资源类型文件大小的系统限制 图片: 10485760 (10Mb: 10 * 1024 * 1024) 默认情况下使用系统限制检查文件大小
detectMime 是否自动检查文件头部信息 0: 不自动检查, 1: 自动检查 默认为自动检查文件头部信息
mimeLimit 指定上传文件类型的限制(MimeType类型) 允许指定多种类型, 请使用';'隔开 各种资源类型允许上传的MimeType类型 图片: jpg: image/jpeg png: image/png bmp: image/bmp gif: image/gif 通配符: image/*
callbackUrl 图片上传完成之后,系统回调该Url
callbackHost 在系统回调时,将设置请求头部的Host信息 设置该参数之前应该首先设置callbackUrl
callbackBody 在系统回调时,将设置请求的Body信息 设置该参数之前应该首先设置callbackUrl 该参数可以包含占位符
callbackBodyType 在系统回调时,将设置请求的Body类型 设置该参数之前应该首先设置callbackUrl 设置该参数之前应该首先设置callbackBody

初始化

require_once('xxx/alimage.class.class.php');
$image  = new AlibabaImage($ak, $sk, $type, $upload_endpoint, $manage_endpoint); 

初始化传入参数:

type: 开发者的服务类型(即AK/SK的颁发类型,百川用户都是TOP)

AK: 开发者的AccessKeyId

SK: 开发者的AccessKeySecret

用户AK/SK的获取方式请参照 Demo 中的描述

$upload_endpoint$manage_endpoint一般不需要填写,使用默认值即可。

form表单上传

html示例:

<html>
  <body>
    <form method="post" action="http://upload.media.aliyun.com/api/proxy/upload?opt=n" enctype="multipart/form-data">
        <label for="file">Filename:</label>
        <input type="file" name="content" />
        <label for="size">size:</label>
        <input type="text" name="size" value="68740"/>
        <label for="filename">filename:</label>
        <input type="text" name="name" value="filename"/>
        <label for="dir">dir:</label>
        <input type="text" name="dir" value="/test" />
        <label for="Authorization">Authorization:</label>
        <input type="text" name="Authorization" value="<?php echo getToken()?>"/>
        <br />
        <input type="submit" name="submit" value="Submit" />
    </form>
  </body>
</html> 

获取token的php代码示例

<?php
function getToken()
{
    $ak = "23****41";
    $sk = "ef9eaf4*******************f5af72";
    $namespace = "qinningtest2";
    list($s1, $s2) = explode(' ', microtime());
    $pol = array(
        "detectMime" => "1",
        "insertOnly" => "0",
        "namespace"  => $namespace,
        "expiration" => -1,
    );

    $encodedPolicy = encodeWithURLSafeBase64(json_encode($pol));
    $signed = hash_hmac( 'sha1', $encodedPolicy, $sk);
    $token = $ak . ":" . $encodedPolicy . ":" . $signed;
    $result = "UPLOAD_AK_TOP " . encodeWithURLSafeBase64($token);
    return $result;
}

function encodeWithURLSafeBase64($arg)
{
    if ($arg === null || empty($arg)) {
        return null;
    }
    $result = preg_replace(array("/\r/", "/\n/"), "", rtrim(base64_encode($arg), '=' )); 
    return $result;
}  
?> 

小文件上传

小文件上传

/*
* 小文件上传,建议比较小的文件采用此种方式,10M以下
*/
public function upload($file, $uploadPolicy, $opts = array(), $meta = array(), $var = array())
$file - 文件名
$uploadPloicy  - 上传策略
$opts - 可选项,包含上传超时时间timeout。不携带的话取默认值30秒
$meta - meta信息
$var - 自定义kv信息对

小文件上传(byContent)

/*
* 小文件上传(byContent),建议比较小的文件采用此种方式,10M以下
*/
public function uploadByContent($content, $uploadPolicy, $opts = array(), $meta = array(), $var = array())
$content - 上传内容
$uploadPloicy  - 上传策略
$opts - 可选项,包含上传超时时间timeout。不携带的话取默认值30秒
$meta - meta信息
$var - 自定义kv信息对

大文件上传

/*
* 大文件上传,建议大的文件采用此种方式,只要文件大于100K都可以采用此种方式
*/
public function uploadSuperfile($file, $uploadPolicy, $opts = array(), $meta = array(), $var = array())
$file - 文件名
$uploadPloicy  - 上传策略
$opts - 可选项,timeout 上传超时时间。不携带的话取默认值30秒
sliceSize -表示分片大小,单位byte。如果没有此项参数表示分片大小默认10M。用户可以根据自己php解释器的能力取值。
$meta - meta信息
$var - 自定义kv信息对

分片上传

创建分片上传任务

/*
* 创建分片上传任务
*/
public function multipartInit($file, $uploadPolicy, $start = 0, $sliceSize = Conf::SUB_OBJ_SIZE, $opts = array(), $meta = array(), $var = array())
$file - 文件名
$uploadPloicy  - 上传策略
$start - 文件读取的起始位置
$sliceSize - 文件切割获取长度
$opts - 可选项,包含上传超时时间timeout。不携带的话取默认值30秒
$meta - meta信息
$var - 自定义kv信息对 

创建分片上传任务(byContent)

/*
* 创建分片上传任务
*/
public function multipartInitByContent($content, $uploadPolicy, $opts = array(), $meta = array(), $var = array())
$content - 内容
$uploadPloicy  - 上传策略
$opts - 可选项,包含上传超时时间timeout。不携带的话取默认值30秒
$meta - meta信息
$var - 自定义kv信息对

分片上传

/*
* 分片上传
*/
public function multipartUpload($file, $uploadPolicy, $start, $sliceSize = Conf::SUB_OBJ_SIZE, $opts = array())
$file - 文件名
$uploadPloicy  - 上传策略
$start - 文件读取的起始位置
$sliceSize - 文件切割获取长度
$opts - 其中必须填写multipartInit返回的uploadId,id,以及本次上传的partNumber
可选项,包含上传超时时间timeout。不携带的话取默认值30秒

分片上传(byContent)

/*
* 分片上传
*/
public function multipartUploadByContent($content, $uploadPolicy, $opts = array())
$content - 内容
$uploadPloicy  - 上传策略
$opts - 其中必须填写multipartInit返回的uploadId,id,以及本次上传的partNumber
可选项,包含上传超时时间timeout。不携带的话取默认值30秒

完成分片上传任务

/*
* 完成分片上传任务
*/
public function multipartComplete($uploadPolicy, $md5Parts, $opts = array())
$uploadPloicy  - 上传策略
$md5Parts - 前面上传的所有文件md5信息汇总,array结构,具体见demo文件
$opts - 其中必须填写multipartInit返回的uploadId,id,以及整个文件的md5

取消分片上传任务

/*
* 取消分片上传任务
*/
public function multipartCancel($uploadPolicy, $opts = array())
$uploadPloicy  - 上传策略
$md5Parts - 前面上传的所有文件md5信息汇总,array结构,具体构造见demo文件
$opts - 其中必须填写multipartInit返回的uploadId,id

SDK 管理接口

文件管理

判断文件是否存在

/*
* 判断文件是否存在
*/
public function existsFile($namespace, $dir, $file);
$namespace - 命名空间,当TYPE 是 CLOUD的时赋值bucket的内容,下同
$dir - 文件夹。文件上传的目录,必须以"/"开头,不以"/"结尾。下同
$file - 文件名。文件名不能包含"/"。下同

获取文件信息

/*
* 获取文件信息
*/
public function getFile($namespace, $dir, $file);
$namespace - 命名空间,当TYPE 是 CLOUD的时赋值bucket的内容,下同
$dir - 文件夹。文件上传的目录,必须以"/"开头,不以"/"结尾。下同
$file - 文件名。文件名不能包含"/"。下同

列出文件夹下文件列表

/*
* 列出文件夹下文件列表
*/
public function listFiles($namespace, $dir);
$namespace - 命名空间,当TYPE 是 CLOUD的时赋值bucket的内容,下同
$dir - 文件夹。文件上传的目录,必须以"/"开头,不以"/"结尾。下同

删除文件

/*
* 删除文件
*/
public function deleteFile($namespace, $dir, $file);
$namespace - 命名空间,当TYPE 是 CLOUD的时赋值bucket的内容,下同
$dir - 文件夹。文件上传的目录,必须以"/"开头,不以"/"结尾。下同
$file - 文件名。文件名不能包含"/"。下同

文件夹管理

创建文件夹

/*
* 创建文件夹
*/
public function createDir($namespace, $dir);
$namespace - 命名空间,当TYPE 是 CLOUD的时赋值bucket的内容,下同
$dir - 文件夹。文件上传的目录,必须以"/"开头,不以"/"结尾。下同

列出文件夹列表

/*
* 列出文件夹列表
*/
public function listDirs($namespace, $dir);
$namespace - 命名空间,当TYPE 是 CLOUD的时赋值bucket的内容,下同
$dir - 文件夹。文件上传的目录,必须以"/"开头,不以"/"结尾。下同

判断文件夹是否存在

/*
* 判断文件夹是否存在
*/
public function existsFolder($namespace, $dir);
$namespace - 命名空间,当TYPE 是 CLOUD的时赋值bucket的内容,下同
$dir - 文件夹。文件上传的目录,必须以"/"开头,不以"/"结尾。下同

删除文件夹

/*
* 删除文件夹
*/
public function deleteDir($namespace, $dir);
$namespace - 命名空间,当TYPE 是 CLOUD的时赋值bucket的内容,下同
$dir - 文件夹。文件上传的目录,必须以"/"开头,不以"/"结尾。下同

示例代码

require_once('../alimage.class.class.php');
$ak = 'xxxxxx';   // app key 
$sk = 'xxxxxxxxxxxxx'; // secret key
$image  = new AlibabaImage($ak, $sk, "TOP" /*$upload_endpoint, $manage_endpoint*/);
$uploadPolicy = new uploadPolicy();
$uploadPolicy->dir = 'dir';// 文件夹名
$uploadPolicy->name = 'file';  // 文件名不能包含"/"
$uploadPolicy->namespace= 'xxxxxxx'; // type =TOP 必填
//$uploadPolicy->bucket= 'xxxxxxx'; // type =CLOUD 必填

// 小文件上传
$res = $image->upload('image/a.jpg', $uploadPolicy, $opts = array());
var_dump($res);
// 直接使用分片上传接口
$res = $image->uploadSuperfile('image/a.jpg', $uploadPolicy);
var_dump($res);

// 分别调用分片上传接口,对于断点续传场景
$file = 'image/a.jpg';
$fileSize = filesize($file);
$filemd5 = md5_file($file);
$subObjSize = 2345677;
$md5_parts = array();
$res = $image->multipartInit($file, $uploadPolicy, 0, $subObjSize);
var_dump($res);
if($res['isSuccess'])
{
    array_push($md5_parts, array('eTag' => $res['eTag'], 'partNumber' => $res['partNumber']));
    $uploadId = $res['uploadId'];
    $id = $res['id'];
    $opts = array();
    $opts['uploadId'] = $uploadId;
    $opts['id'] = $id;
    $opts['partNumber'] = 2;
    $res = $image->multipartUpload($file, $uploadPolicy, $subObjSize, $fileSize-$subObjSize, $opts);
    var_dump($res);
    if($res['isSuccess'])
    {
        array_push($md5_parts, array('eTag' => $res['eTag'], 'partNumber' => $res['partNumber']));
        $opts = array();
        $opts['uploadId'] = $uploadId;
        $opts['id'] = $id;
        $opts['md5'] = $filemd5;
        $res = $image->multipartComplete($uploadPolicy, $md5_parts, $opts);
        var_dump($res);
    }else{
        $opts = array();
        $opts['uploadId'] = $uploadId;
        $opts['id'] = $id;
        $res = $image->multipartCancel($uploadPolicy, $opts);
        var_dump($res);
    }
}