上传文件

在MSS中提供了丰富的文件上传接口,可以通过以下方式上传文件:

  • 字符串上传
  • 文件上传
  • 分片上传

流式上传、文件上传的文件最大不能超过5GB。当文件较大时,请使用分片上传,分片上传的大小不能超过5T。

字符串上传

以下代码实现了上传指定字符串到文件中:

require '/path/to/mss.phar';

$accessKeyId = "<从MSS获得的AccessKeyId>";
$accessKyeSecret = "<从MSS获得的AccessKeySecret>";
$endpoint = "<选定的MSS数据中心访问域名,例如http://mtmss.com>";
$bucket = "<使用的bucketName,注意命名规范>";
$object = "<使用的Object名字,注意命名规范>";
$content = "Hello MSS!";

$mssClient = Mss\S3\S3Client::factory([
        'endpoint' => $endpoint,
        'key'    => $accessKeyId,
        'secret' => $accessKeySecret,]);

$mssClient->putObject(array(
        'Bucket' => $bucket,
        'Key' => $object,
        'Body' => $content));

上传本地文件

以下代码实现上传指定本地文件:

require '/path/to/mss.phar';

$accessKeyId = "<从MSS获得的AccessKeyId>";
$accessKyeSecret = "<从MSS获得的AccessKeySecret>";
$endpoint = "<选定的MSS数据中心访问域名,例如http://mtmss.com>";
$bucket = "<使用的bucketName,注意命名规范>";
$object = "<使用的Object名字,注意命名规范>";
$LocalFile ="path/to/local/file";

$mssClient = Mss\S3\S3Client::factory([
        'endpoint' => $endpoint,
        'key'    => $accessKeyId,
        'secret' => $accessKeySecret,]);

$mssClient->putObject(array(
        'Bucket' => $bucket,
        'Key'=>$object,
        'SourceFile' => $LocalFile));

分片上传

除了通过PutObject接口上传文件到MSS以外,MSS还提供了另外一种上传模式 —— Multipart Upload。用户可以在如下的应用场景内(但不仅限于此),使用Multipart Upload上传模式,如:

  • 需要支持断点上传。
  • 上传超过100MB大小的文件。
  • 网络条件较差,和MSS的服务器之间的链接经常断开。
  • 上传文件之前,无法确定上传文件的大小。

分片上传本地文件

以下代码分片上传本地文件:

require '/path/to/mss.phar';

$accessKeyId = "<从MSS获得的AccessKeyId>";
$accessKyeSecret = "<从MSS获得的AccessKeySecret>";
$endpoint = "<选定的MSS数据中心访问域名,例如http://mtmss.com>";
$bucket = "<使用的bucketName,注意命名规范>";
$object = "<使用的Object名字,注意命名规范>";
$file =__FILE__;

$mssClient = Mss\S3\S3Client::factory([
        'endpoint' => $endpoint,
        'key'    => $accessKeyId,
        'secret' => $accessKeySecret,]);


$mssClient->upload($bucket, $object, fopen(__FILE__, 'r'), 'public-read', array());

分片上传本地目录

以下代码进行分片上传目录操作:

require '/path/to/mss.phar';

$accessKeyId = "<从MSS获得的AccessKeyId>";
$accessKyeSecret = "<从MSS获得的AccessKeySecret>";
$endpoint = "<选定的MSS数据中心访问域名,例如http://mtmss.com>";
$bucket = "<使用的bucketName,注意命名规范>";
$object = "<使用的Object名字,注意命名规范>";
$file =__FILE__;

$mssClient = Mss\S3\S3Client::factory([
        'endpoint' => $endpoint,
        'key'    => $accessKeyId,
        'secret' => $accessKeySecret,]);


$mssClient->uploadDirectory('/path/to/dir',$bucket, 'prefix', array());

原始接口分片上传

分片上传(MultipartUpload)一般的流程如下:

  • 初始化一个分片上传任务(InitiateMultipartUpload)
  • 逐个或并行上传分片(UploadPart)
  • 完成上传(CompleteMultipartUpload)或取消分片上传(AbortMultipartUpload) 下面通过一个完整的示例说明了如何通过原始的api接口一步一步的进行分片上传操作,如果用户需要做断点续传等高级操作,可以参考下面代码:
require '/path/to/mss.phar';

$accessKeyId = "<从MSS获得的AccessKeyId>";
$accessKyeSecret = "<从MSS获得的AccessKeySecret>";
$endpoint = "<选定的MSS数据中心访问域名,例如http://mtmss.com>";
$bucket = "<使用的bucketName,注意命名规范>";
$object = "<使用的Object名字,注意命名规范>";
$filename = "<本地文件>";


$mssClient = Mss\S3\S3Client::factory([
        'endpoint' => $endpoint,
        'key'    => $accessKeyId,
        'secret' => $accessKeySecret,]);

$result = $mssClient->createMultipartUpload(array(
            'Bucket'   => $bucket,
            'Key'      => $object));
$uploadId = $result['UploadId'];

$file = fopen($LocalBigFile, 'r');
$parts = array();
$partNumber = 1;
while (!feof($file)) {
    $result = $mssClient->uploadPart(array(
        'Bucket'     => $bucket,
        'Key'        => $object,
        'UploadId'   => $uploadId,
        'PartNumber' => $partNumber,
        'Body'       => fread($file, 5 * 1024 * 1024),
    ));
    $parts[] = array(
        'PartNumber' => $partNumber++,
        'ETag'       => $result['ETag'],
    );
}

$result = $mssClient->completeMultipartUpload(array(
    'Bucket'   => $bucket,
    'Key'      => $object,
    'UploadId' => $uploadId,
    'Parts'    => $parts,
));
$url = $result['Location'];

fclose($file);

查看已上传的分片

指定UploadId查看所有已经上传成功的分片。 通过下面代码,可以查看一次上传任务已上传的分片:

require '/path/to/mss.phar';

$accessKeyId = "<从MSS获得的AccessKeyId>";
$accessKyeSecret = "<从MSS获得的AccessKeySecret>";
$endpoint = "<选定的MSS数据中心访问域名,例如http://mtmss.com>";
$bucket = "<使用的bucketName,注意命名规范>";
$object = "<使用的Object名字,注意命名规范>";
$uploadId = "<Upload ID>";

$mssClient = Mss\S3\S3Client::factory([
        'endpoint' => $endpoint,
        'key'    => $accessKeyId,
        'secret' => $accessKeySecret,]);

$result = $mssClient->listParts(array(
            'Bucket'   => $bucket,
            'Key'      => $object,
            'UploadId' => $uploadId));

echo $result;

查看当前正在进行的分片上传任务

require '/path/to/mss.phar';

$accessKeyId = "<从MSS获得的AccessKeyId>";
$accessKyeSecret = "<从MSS获得的AccessKeySecret>";
$endpoint = "<选定的MSS数据中心访问域名,例如http://mtmss.com>";
$bucket = "<使用的bucketName,注意命名规范>";
$object = "<使用的Object名字,注意命名规范>";
$uploadId = "<Upload ID>";

$mssClient = Mss\S3\S3Client::factory([
        'endpoint' => $endpoint,
        'key'    => $accessKeyId,
        'secret' => $accessKeySecret,]);

$iterator = $mssClient->getIterator('ListMultipartUploads', array(
    'Bucket'    => 'bucket-1',
    'Delimiter' => '/'
    ), array());

$actualUploads = array();

foreach ($iterator as $upload) {
        if (isset($upload['Key'])) {
                $actualUploads[] = "$upload[Key]|$upload[UploadId]";
        } else {
                $actualUploads[] = $upload['Prefix'];
        }
}

foreach ($actualUploads as $upload) {
        echo "$upload\n";
}

设置元信息

文件元信息(Object Meta),是对用户上传到MSS的文件的属性描述,分为两种:HTTP标准属性(HTTP Headers)和User Meta(用户自定义元信息)。 文件元信息可以在各种方式上传(字符串上传、文件上传、追加上传、分片上传),或拷贝文件时进行设置。元信息的名称大小写不敏感。

设定Http Header

MSS允许用户自定义Http header。几个常用的http header说明如下:

名称 描述 默认值
Content-MD5 文件数据校验,设置了该值后OSS会启用文件内容MD5校验,把您提供的MD5与文件的MD5比较,不一致会抛出错误
Content-Type 文件的MIME,定义文件的类型及网页编码,决定浏览器将以什么形式、什么编码读取文件。如果用户没有指定则根据Key或文件名的扩展名生成,如果没有扩展名则填默认值 application/octet-stream
Content-Disposition 指示MINME用户代理如何显示附加的文件,打开或下载,及文件名称
Content-Length 上传的文件的长度,超过流/文件的长度会截断,不足为实际值 流/文件时间长度
Cache-Control 指定该Object被下载时的网页的缓存行为

以下代码在上传的同时设置了文件的Http Headers:

require '/path/to/mss.phar';

$accessKeyId = "<从MSS获得的AccessKeyId>";
$accessKyeSecret = "<从MSS获得的AccessKeySecret>";
$endpoint = "<选定的MSS数据中心访问域名,例如http://mtmss.com>";
$bucket = "<使用的bucketName,注意命名规范>";
$object = "<使用的Object名字,注意命名规范>";
$content = "Hello MSS!";

$mssClient = Mss\S3\S3Client::factory([
        'endpoint' => $endpoint,
        'key'    => $accessKeyId,
        'secret' => $accessKeySecret,]);

$optins = array(

$mssClient->putObject(array(
        'Bucket' = > $bucket,
        'Key' => $object,
        'Body' => $content,
        'ContentDisposition' => 'attachment; filename="xxxxxx"',
        'ContentType' => 'image/jpg'));

用户自定义元信息

MSS支持用户自定义Object的元信息,对Object进行描述。 以下代码在上传的同时设置了文件的自定义元信息:

require '/path/to/mss.phar';

$accessKeyId = "<从MSS获得的AccessKeyId>";
$accessKyeSecret = "<从MSS获得的AccessKeySecret>";
$endpoint = "<选定的MSS数据中心访问域名,例如http://mtmss.com>";
$bucket = "<使用的bucketName,注意命名规范>";
$object = "<使用的Object名字,注意命名规范>";
$content = "Hello MSS!";

$mssClient = Mss\S3\S3Client::factory([
        'endpoint' => $endpoint,
        'key'    => $accessKeyId,
        'secret' => $accessKeySecret,]);

$optins = array(

$mssClient->putObject(array(
        'Bucket' = > $bucket,
        'Key' => $object,
        'Body' => $content,
        'ContentDisposition' => 'attachment; filename="xxxxxx"',
        'ContentType' => 'image/jpg',
        'Metadata'   => array(
            'Foo' => 'abc',
            'Baz' => '123')));